MSN: Phenzer@hotmail.com 欢迎加为好友讨论测试

Perl: 各种变量或子程序的引用

上一篇 / 下一篇  2010-11-22 14:03:39 / 个人分类:脚本语言

所谓引用,它只是指向一组数据的指针,并不包含实际数据的本身。该引用通常存放在另一个标量变量中。

1.若要创建对某个既定变量的引用,可以在该变量的前面加上一个反斜杠。也即,你可以用一个反斜杠创建一个指向任何命名变量或者子过程的引用.
下面是一些例子:
$foo = "test";
$scalarRef = \$foo;
$constRef  = \186_282.42;
$arrayRef  = \@ARGV;
$hashRef   = \%ENV;

2.若要通过引用$scalarRef 来输出$foo的值,你可以像下面这样使用另一个$:
print $$scalarRef;
在上面的代码段中,$scalarRef包含了引用。增加的一个$告诉Perl,$scalarRef 中的引用指的是一个标量值。$scalarRef引用的标量值被取出并输出。

3.可以通过引用来修改原始值,这是你对数据拷贝所不能进行的操作.下面这个代码用于修改$foo中的原始值:
$$scalarRef="newvalue";
如果你使用$scalarRef而不是$$scalarRef
$scalarRef="newvalue";
那么存放在$scalarRef中的引用将被撤消并被实际值取代
上面这个代码段运行后,$scalarRef不再包含一个引用,它只是一个标量.

4.你可以像任何其他标量值那样,给引用赋值:
$name="Gandalf";
$nref=\$name;#标量name的引用
$oref=$nref;#标量name的引用的拷贝赋值给oref,此时nref和oref都指向Gandalf

5.也可以存放对某个引用的引用
$name="Gandalf";
$nref=\$name;#标量name的引用
$oref=\$nref;#$nref的引用,$oref-->$nref-->$name
此时,使用 $$$oref才能得到$name的值

实例一:对标量的引用
$number=123;
$string="abc";
$numPointer = \$number;
$strPointer = \$string;
print "\$numPointer=$numPointer\n";
print "\$number=$$numPointer\n\n";
print "\$strPointer=$strPointer\n";
print "\string=$$strPointer\n";

实例二:对数组的引用
$arrPointer = \@ARGV;
$i = scalar(@$arrPointer);
print "\@ARGV array has $i numbers\n";
$i = 0;
foreach (@$arrPointer){
print "$$arrPointer[$i]\n";
}

实例三:对哈希的引用
%month = (
'01', 'Jan',
'02', 'Feb',
'03', 'Mar',
'04', 'Apr',
'05', 'May',
'06', 'Jun',
'07', 'Jul',
'08', 'Aug',
'09', 'Sep',
'10', 'Oct',
'11', 'Nov',
'12', 'Dec',
);
$hashPointer = \%month;
print "first way:using foreach and reference\n";
foreach (sort keys %$hashPointer){
print "1.the $_ is $$hashPointer{$_}\n";
print "2.the $_ is $hashPointer->{$_}\n";
print "3.the $_ is ${$hashPointer}{$_}\n";
}
print "second way:using each\n";
while(($index,$value)=each(%$hashPointer)){
print "$index,$value\n";
}
print "third way:using foreach\n";
foreach (sort keys %month){
print "the $_ is $month{$_}\n";
}

实例四:对文件句柄的引用
$logFile = "C:\\Documents and Settings\\pzhang\\桌u-26782 \\Perl\\1.txt";
$arFile =  "C:\\Documents and Settings\\pzhang\\桌u-26782 \\Perl\\2.txt";
#open(LOGFILE,">$logFile")||die "can not open file $logFile$!\n";
#open(ARFILE,">$arFile")||die "can not open file $arFile$!\n";
open(LOGFILE,">>$logFile")||die "can not open file $logFile$!\n";
open(ARFILE,">>$arFile")||die "can not open file $arFile$!\n";
sub printFileToMulPlace {
my $line = shift;
print $line "test file reference,hhee\n";
}
&printFileToMulPlace(\*STDOUT);
&printFileToMulPlace(\*LOGFILE);
&printFileToMulPlace(\*ARFILE);
print "Current line is:".__LINE__."\n";
print "Current file executed is:".__FILE__."\n";
__END__;#脚本末尾位置,之后的内容被忽略
print "Current line is:".__LINE__."\n";
print "Current file executed is:".__FILE__."\n";
 
实例五:对子程序的引用
sub errMsg {
my $lvl = shift;
return sub {
my $msg = shift;
print "error level description for $lvl:$msg\n";
}
}
$sever = errMsg("sever");
$fatal = errMsg("fatal");
$annoy = errMsg("annoy");

&$sever("Divide by zero");
&$fatal("Did you forget to use a semi-colon?");
&$annoy("Uninitialized variable in use");

实例六:多数组的引用
$arr = ['solid','black',['1','2','3',['4','5','6']]];
print "\$arr->[0]=$arr->[0]\n";
print "\$arr->[1]=$arr->[1]\n";
print "\$arr->[2][0]=$arr->[2][0]\n";
print "\$arr->[2][1]=$arr->[2][1]\n";
print "\$arr->[2][2]=$arr->[2][2]\n";
print "\$arr->[2][3][0]=$arr->[2][3][0]\n";
print "\$arr->[2][3][1]=$arr->[2][3][1]\n";
print "\$arr->[2][3][2]=$arr->[2][3][2]\n";

实例七:哈希数组的引用
%cube = (
'0', ['0', '0', '0'],
'1', ['0', '0', '1'],
'2', ['0', '1', '0'],
'3', ['0', '1', '1'],
'4', ['1', '0', '0'],
'5', ['1', '0', '1'],
'6', ['1', '1', '0'],
'7', ['1', '1', '1']
);
$pointer = \%cube;
foreach $i (sort keys %$pointer){
$line = $$pointer{$i};
$x = $line->[0];
$y = $line->[1];
$z = $line->[2];
print "Point $i= $x $y $z\n";
}

实例七:在子程序中多数组的引用
print "1、当想传递给子程序的参数是多于一个的数组时一定要使用引用
2、一定不要在子程序中使用形如(\@variable)=\@_; 的语句处理参数,除非你想把所有参数集中到一个长的数组中\n";
@names = (Jack,Mike,David);
@phones = (88645,23541,56284);
my $i = 0;
sub listEm {
my ($a,$b) = @_;
foreach  (@$a) {
print "@$a[$i]"."\t @$b[$i]\n";
$i ++;
}
#for($j=0;$j<@$a;$j++){
#print "a[$j] = " . @$a[$j] . " " . "\tb[$j] = " . @$b[$j] . "\n";
#}
}
&listEm(\@names,\@phones);

TAG: 文件 引用 Perl perl 数组 哈希 子程序

 

评分:0

我来说两句

Open Toolbar