perl雖然返回值可以N個,即一個數組,可以讀取單個變量,或者數組,或者哈希散列,以及他們的有限組合,為什麽說有限組合呢,如果返回return($var1,$var2,@arr)這樣子的,其實perl跟本識別不出來返回值這個大數組是什麽意思,它就按照,讀第一個給一個變量,讀第二個給一個變量,剩餘的所有都給數組,就是這麽處理的。
有限就表達出來了,如果返回return($var,@arr,%hash),變量很容易,第一個拿走就是了,後面的呢,數組全部是一個一個變量,雖然哈希散列是key=>value,但是存儲起來時候還是('name','dorainm','mail','dorainm@gmail.com',...),只不過邏輯上前後2個變量是一對而已。對于這個返回值,Perl是無法區分@數組什麽時候結束,又什麽時候開始把變量全部給%哈希的。
就像C語言只能返回一個值,但是我們可以讓這個值是個指針,指向多個字符的字符串內存,甚至一個結構體,可以擁有任意組合的整數、字符等變量。同樣,我們的Perl也可以使用指針。
$var表示為一個變量的話,\$var就是這個變量的地址了,相當于C當中的&var,\和&分別是Perl和C的取址!!
當$pot = \$var是,即 pot = &var,指針變量 pot就指向 var了。
那麽通過修改pot存儲的地址所指向的內存單元的內容,就是修改了var,
Perl就是這麽寫的,$$pot=$newvar,就像C的,*pot=newvar,$和*分別是Perl和C的取值。
下面是一個演示代碼:
#!/usr/bin/perl
use strict;
my $var = 1;
my @array = qw/1 2 3/;
my %hash = ( 'name'=>'dorainm', 'mail'=>'dorainm@gmail.com', 'blog'=>'dorainm.cublog.cn' );
print "===== before ===============================\n";
print "value = $var\n";
print "array = @array\n";
print "hash name: $hash{'name'}, mail: $hash{'mail'}, blog: $hash{'blog'}\n";
&run_pointer( \$var, \@array, \%hash );
print "===== after ================================\n";
print "value = $var\n";
print "array = @array\n";
print "hash name: $hash{'name'}, mail: $hash{'mail'}, blog: $hash{'blog'}\n";
exit;
sub run_pointer
{
my ( $lvar, $larray, $lhash ) = @_;
$$lvar = 255;
$$larray[0] *= 3;
${$larray}[1] *= 2;
$larray->[2] *= 1;
$$lhash{'name'} = 'dorainm.cublog.cn';
${$lhash}{'mail'} = 'dorainm';
$lhash->{'blog'} = 'dorainm@gmail.com';
1;
}
|
運行結果如下:
===== before ===============================
value = 1
array = 1 2 3
hash name: dorainm, mail: dorainm@gmail.com, blog: dorainm.cublog.cn
===== after ================================
value = 255
array = 3 4 3
hash name: dorainm.cublog.cn, mail: dorainm, blog: dorainm@gmail.com
通過指針,沒有使用返回值,我們同時修改了變量、數組、哈希的值
取值的數組表達方式有3種,例子中全部也介紹了,$$larray[0],${$larray}[1],$larray->[2]
取值的哈希表達方式有3種,例子中全部也介紹了,$$lhash{'name'},${$lhash}{'mail'},$lhash->{'blog'}
如果遇到二維數組之類的,也是相同方法的,表達的時候留心下就可以了~
#!/usr/bin/perl
use strict;
my @rs = ( [(1,2,3)], [(4,5,6)], [(7,8,9)]);
print "===== before ===============================\n";
&display( @rs );
&run_point( \@rs );
print "===== after ================================\n";
&display( @rs );
sub display
{
my @lrs = @_;
for( my $i=0; $i<3; $i++ )
{
print "$lrs[$i][0] $lrs[$i][1] $lrs[$i][2]\n";
}
1;
}
sub run_point
{
my $lrs = $_[0];
for( my $i=0; $i<3; $i++ )
{
$$lrs[$i][0] *= 2;
${$lrs}[$i][1] *= 2;
$lrs->[$i][2] *= 2;
}
1;
}
|
運行結果如下:
===== before ===============================
1 2 3
4 5 6
7 8 9
===== after ================================
2 4 6
8 10 12
14 16 18
阅读(2287) | 评论(0) | 转发(0) |