Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1147241
  • 博文数量: 53
  • 博客积分: 10025
  • 博客等级: 上将
  • 技术积分: 1640
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-15 17:05
文章分类

全部博文(53)

文章存档

2011年(1)

2010年(3)

2009年(25)

2008年(24)

我的朋友

分类:

2009-04-14 22:13:40

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) |
给主人留下些什么吧!~~