perl的sub参数可以在sub里修改么?

perl的sub参数可以在sub里修改么?

比如在C里,如果参数是个指针的话,可以在function内部修改他,这样函数就可以有多个返回值了,请问perl可以这么写么,如果可以的话,应该怎么写啊?

多谢了!


你想要返回多个值,还是想修改 @_
可以直接修改。也能返回多个值

[Copy to clipboard] [ - ]
CODE:
my @num = (1, 2, 3, 5);

sub test_sub{
    $_[2] = 15;
}

print "$num[2]\n";
test_sub(@num);
print "$num[2]\n";

./test
3
15



QUOTE:
原帖由 SadEmperor 于 2008-11-6 13:54 发表
比如在C里,如果参数是个指针的话,可以在function内部修改他,这样函数就可以有多个返回值了,请问perl可以这么写么,如果可以的话,应该怎么写啊?

多谢了!

在 Perl 的 sub 中,@_ 的成员是实参 list 对应成员的 alias,也即 Perl 的参数传递是传地址或引用,详见 perlsub

楼主只是想返回多个值的话,直接 return (值1, 值2, 值3)就行了。

sub foo {
  return (1,2,3);
}
my ($a, $b, $c) = foo();  # $a=1, $b=2, $c=3

像c一样修改参数虽然也能达到目的,但直接return要方便很多,也好理解得多


QUOTE:
原帖由 MMMIX 于 2008-11-6 14:11 发表

在 Perl 的 sub 中,@_ 是实参 list 的 alias,也即 Perl 的参数传递是传地址或引用,详见 perlsub

子函数的参数用引用的话也不会比直接用数组或散列好了?
原以为用直接用数组作参数会造成copy呢 .


QUOTE:
原帖由 tmp 于 2008-11-6 14:20 发表



子函数的参数用引用的话也不会比直接用数组或散列好了?
原以为用直接用数组作参数会造成copy呢 .

引用的好处在于参数中的 hash 或者 array 不会被展开(或者 collapse)成为一个 flat list
多谢ls各位:)


QUOTE:
原帖由 MMMIX 于 2008-11-6 14:11 发表

在 Perl 的 sub 中,@_ 的成员是实参 list 对应成员的 alias,也即 Perl 的参数传递是传地址或引用,详见 perlsub

再请教一下, 这种情况是不是只适用于标量参数? 比如下面的程序,标量的引用地址是一样的,数组的地址就不一样了,可以这么理解么?

my @num = (1, 2, 3, 5);

sub test_sub{
    print 'ref to @_      = ' . \@_ . "\n";
    print 'ref to $_[2]   = ' . \$_[2] . "\n";
}
print 'ref to @num    = ' . \@num . "\n";
print 'ref to $num[2] = ' . \$num[2]."\n";
&test_sub(@num);


在我机器上的结果:
ref to @num      = ARRAY(0x1832a60)     -- 1
ref to $num[2]   = SCALAR(0x183f16c)    -- 2
ref to @_           = ARRAY(0x198aeac)      -- 3
ref to $_[2]        = SCALAR(0x183f16c)    --  4

1,3 不一样,但是2,4是一样的。



QUOTE:
原帖由 SadEmperor 于 2008-11-6 15:11 发表


再请教一下, 这种情况是不是只适用于标量参数? 比如下面的程序,标量的引用地址是一样的,数组的地址就不一样了,可以这么理解么?

@_ 是一 local array。详细的情况可以看看 perlsub,说的已经很清楚了。