天天看點

PERL

[oracle@jhoa 2]$ cat a2.pl 
foreach $key (keys %main::)
{print "\$$key =>  $main::{$key}\n";}

[oracle@jhoa 2]$ perl a2.pl 
$/ => *main::/
$stderr =>  *main::stderr
$key => *main::key
$utf8:: =>  *main::utf8::
$" => *main::"
$CORE:: =>  *main::CORE::

main包内容:


Perl 本地變量; 一個是my 一個是local

Perl 的my操作符用于建立詞法作用域變量。通過my建立的變量,存活于聲明開始的地方,直到閉合作用域結尾。

閉合作用域指的可以是一對花括号中的區域,可以是一個檔案,也可以是一個eval字元串。

閉合作用域是詞法作用域,僅在編譯時對程式源代碼掃描過程中确定。


[oracle@jhoa 2]$ perl a4.pl 
1-----2.7183
2-----3.1415926

[oracle@jhoa 2]$ cat a4.pl 
$a = 3.1415926; ##全局變量
{
 my $a = 2.7183; ##詞法的
print "1-----$a\n";
}
print "2-----$a\n";

[oracle@jhoa 2]$ perl a4.pl 
1-----2.7183
2-----3.1415926

這裡花括号外面用到的變量$a是全局變量$a,而在花括号内部的$a是詞法變量$a,它的作用域僅限于花括号内。

my變量不存在與符号表中


local 的運作時作用域:

local在運作時起作用

my編譯時起作用

my建立了不同的變量,而local隻是将已存在的變量值暫時儲存起來

[oracle@jhoa 2]$ cat a4.pl 
$a = 3.1415926; ##全局變量
{
 local $a = 2.7183; ##詞法的
print "1-----$a\n";
}
print "2-----$a\n";

[oracle@jhoa 2]$ perl a4.pl 
1-----2.7183
2-----3.1415926

通常情況下,我們應該用my,理由之一是my比local快,因為local将值存入棧的操作,是需要消耗時間的。


[oracle@jhoa 2]$ cat a5.pl 
my @a = (a,b,c,d);
local ($a,$b,$c) = @a; ##@a中的前3個元素
print "\$a is $a\n";
print "\$b is $b\n";
print "\$c is $c\n";

[oracle@jhoa 2]$ perl a5.pl 
$a is a
$b is b
$c is c


若非必要請勿直接使用@_

[oracle@jhoa 2]$ cat a6.pl 
sub digits_gone {
my ($str) = @_;
$str =~ tr/0-9//d;   ##删除字元竄中的數字
print "\$str is $str\n";                
}
digits_gone (aaaaa,bbbbb,cccccc);
[oracle@jhoa 2]$ perl a6.pl 
$str is aaaaa

子程式的參數都是通過數組變量@_傳遞的。

數組的引用:

sh-3.2$ cat 2.pl 
{my @a ="a b c d e f g";$b=\@a;} print "$b\n";
{my @a ="a b c d e f g";$b=\@a;} print "@$b\n";
{my @a ="a b c d e f g";$b=\@a;} print "@{$b}\n";
sh-3.2$ perl 2.pl 
ARRAY(0x9e9a080)
a b c d e f g
a b c d e f g

數組元素的引用:
sh-3.2$ cat 5.pl 
my @a = qw/1 2 3 4 5 6/;
{my @a = qw/1 2 3 4 5 6/; $b=\@a;} print "$$b[1]\n";
{my @a = qw/1 2 3 4 5 6/; $b=\@a;} print "$b->[1]\n";
sh-3.2$ perl 5.pl 
2
2





hash引用:

[oracle@jhoa 3]$ cat 2.pl 
{my %a =(a=>1,b=>2,c=>3) ;$b=\%a;} print "$b\n";
{my %a =(a=>1,b=>2,c=>3) ;$b=\%a;} print %$b;
[oracle@jhoa 3]$ perl 2.pl 
HASH(0x7013080)
c3a1b2[oracle@jhoa 3]$ 



函數引用:

[oracle@jhoa 3]$ cat 3.pl 
sub printlog {
 print "xxxxxxx\n";
}
{my $a=\&printlog;print "$a\n"};
{my $a=\&printlog;print &$a};
[oracle@jhoa 3]$ perl 3.pl 
CODE(0xc1b0080)
xxxxxxx
1[oracle@jhoa 3]$ 

1 是函數的傳回值:

簡單變量的引用:

sh-3.2$ cat 4.pl 
{my $a ="a";$b=\$a;} print "$b\n";
{my $a ="a";$b=\$a;} print "$$b\n";
{my $a ="a";$b=\$a;} print "${$b}\n";
sh-3.2$ perl 4.pl 
SCALAR(0x168fb060)
a
a




      
上一篇: perl