perl子例程参数传递方式之二:数组作参数

王朝perl·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

我们已经知道, perl子例程参数传递方式类似于引用(或者地址)传递,如果在sub里改变形参的值,实参的值亦随之改变。注意:只有实参为一个变量的时候,形参的值才可以改变。类似 &test(1, "abc");

sub test {

$_[0]++; ....

}

的代码将会报错:

Modification of a read-only value attempted at D:\PerlExec\Noname11.pl line 6.

看来,perl的参数传递方式真的很特别,它不同于任何语言。

既然传递的是引用,数组可以作为参数么?其值可以改变么?可以追加删除元素么?对原数组会造成什么影响?

sample03.pl

#!/usr/bin/perl

@arr = (a,b,c,d,e);

print "main:\n";

foreach (@arr) {

print "$_\n";

}

&test(@arr);

foreach (@arr) {

print "$_\n";

}

sub test{

print "\nsub:\n";

shift @_;

$_[0] = "g";

$_[10] = "h";

push @_, "f";

}

执行结果:

main:

a

b

c

d

e

sub:

a

g

c

d

e

数组仍然维持原来的大小不变,元素既没有增加也没有减少,第二个元素的内容变为"g"。 系统为每个sub维护一个数组@_,容纳所有的参数,元素均为实参的引用。对@_的追加删除操作仅在sub内有效。 如果我希望对数组所有的操作都能反映到实参呢?让sub返回@_,对实参变量重新付值。

sample04.pl

#!/usr/bin/perl

@arr = (a,b,c,d,e);

print "main:\n";

foreach (@arr) {

print "$_\n";

}

$count = 0;

@arr = &test(@arr);

foreach (@arr) {

print "$_\n";

}

sub test{

print "\nsub:\n";

shift @_;

$_[0] = "g";

$_[10] = "h";

push @_, "f";

@_;

}

运行结果:

main:

a

b

c

d

e

sub:

g

c

d

e

h

f

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有  導航