alias在perl中传递数组参数的含义是什么?是对的是以下代码吗?
#!/usr/bin/perl
@myarray = (1, 2, 3, 4, 5);
&my_sub(@myarray);
sub my_sub {
my (@subarray) = @_;
print @subarray;
}
答案 0 :(得分:1)
此代码:
sub my_sub {
my (@subarray) = @_;
print @subarray;
}
创建传递给子例程的数组的副本。如果要修改子例程中的数组而不修改原始数组,这是正确的。
在现代Perl中调用子例程的正确方法只是my_sub(@myarray);
。您不应该使用&
。
答案 1 :(得分:0)
术语别名描述了多个名称可以指向相同的数据,而没有引用的句法限制。
在Perl中,别名可以通过例如任意方式创建。 Data::Alias
,但有一些构造可以自己创建别名。
foreach循环。 current元素是列表中原始元素的别名:
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]
的别名。
使用这些别名可以让你拥有out-arguments,但这会产生一些不合时宜的API。
您还应注意Perl通常具有复制语义。这意味着语句$foo = $bar
通常将<{1}}的数据复制到$bar
。副本是一个单独的实体,如果原件是别名,则副本本身不会成为别名。在列表上下文中复制时,将复制所有元素。这意味着
$foo
和
做同样的事情my @array = @_;
此会破坏所有别名。
事实上,这在Perl中用作“按值调用”的模式,并允许限制子例程的副作用。