别名在perl中传递数组参数的含义是什么?下面的代码是否正确?别名在perl中传递数组参数的含义是什么?
#!/usr/bin/perl
@myarray = (1, 2, 3, 4, 5);
&my_sub(@myarray);
sub my_sub {
my (@subarray) = @_;
print @subarray;
}
别名在perl中传递数组参数的含义是什么?下面的代码是否正确?别名在perl中传递数组参数的含义是什么?
#!/usr/bin/perl
@myarray = (1, 2, 3, 4, 5);
&my_sub(@myarray);
sub my_sub {
my (@subarray) = @_;
print @subarray;
}
术语别名描述了多个名称可以指向同一个数据,没有引用的语法限制。
在Perl中,别名可以通过例如任意地创建。 Data::Alias
,但有一些构造会自行创建别名。
foreach循环。目前的元素是它的别名列表中的原始元素:
my @array = 1 .. 5;
for my $elem (@array) {
$elem++; # $elem is an alias to $array[$i]
}
# the @array is now 2 .. 6.
子程序参数。 Perl子程序用平面标量列表来调用(即像哈希或数组这样的集合被平铺到这个列表中)。该列表可通过@_
阵列访问。此数组中的所有元素都是参数的别名。
sub alias_increment {
for my $elem (@_) {
$elem++;
}
}
my @array = 1 .. 5;
alias_increment(@array);
# array now is 2 .. 6.
请注意,在这个例子中,@_
不是一个别名@array
,但$_[$i]
是一个别名$array[$i]
。
使用这些别名可以让你拥有超出参数,但是这使得akward APIs imho。
你也应该注意,Perl的通常有复制语义。这意味着$foo = $bar
的声明通常复制的数据$bar
到$foo
。副本是一个单独的实体,如果原始文件是别名,副本本身不会是别名。在列表上下文中复制时,将复制所有元素。这意味着,
my @array = @_;
做同样的事情
my @array;
$array[0] = $_[0];
# ...
这打破了所有走样。
这实际上被用作Perl中的一种模式来执行“按值调用”并允许限制子例程的副作用。
此代码:
sub my_sub {
my (@subarray) = @_;
print @subarray;
}
使使通入子程序阵列的拷贝。如果您想在不修改原始数组的情况下修改子程序中的数组,则这是正确的。
在现代Perl中调用子程序的正确方法是my_sub(@myarray);
。你不应该使用&
。
谢谢!!但是在subroutie中,如果你在变量的前面添加'my'或'local',原始数组永远不会被修改。 – baozailove 2013-03-21 12:36:08
@baozailove,这里的关键是你正在复制数组到另一个变量。这就是为什么它没有被修改。另外,请注意'my'和'local'是非常不同的。 – 2013-03-21 14:40:23
我不确定你的意思是“别名”。这在Perl中有特定的含义。你能否重写这个问题而不使用单词“别名”?另外,你想完成什么?除非我们知道你想要完成什么,否则我们无法弄清它是否是正确的代码。 – Schwern 2013-03-21 08:21:20
#!/ usr/bin/perl @myarray =(1,2,3,4,5); &my_sub(@myarray); sub my_sub { my(@subarray)= @_; print @subarray; } – baozailove 2013-03-21 08:39:23
我想知道上面的代码在子程序中使用别名方法吗? – baozailove 2013-03-21 08:42:30