别名在perl中传递数组参数是什么意思?下面的代码对吗?
#!/usr/bin/perl
@myarray = (1, 2, 3, 4, 5);
&my_sub(@myarray);
sub my_sub {
my (@subarray) = @_;
print @subarray;
}
别名在perl中传递数组参数是什么意思?下面的代码对吗?
#!/usr/bin/perl
@myarray = (1, 2, 3, 4, 5);
&my_sub(@myarray);
sub my_sub {
my (@subarray) = @_;
print @subarray;
}
这段代码:
sub my_sub {
my (@subarray) = @_;
print @subarray;
}
制作传递给子例程的数组的副本。如果您想修改子程序中的数组而不修改原始数组,这是正确的。
在现代 Perl 中调用子例程的正确方法是my_sub(@myarray);
. 你不应该使用&
.
术语别名描述了多个名称可以指向相同的数据,而没有引用的句法限制。
在 Perl 中,可以通过 eg 任意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 API 恕我直言。
您还应该注意 Perl 通常具有复制语义。这意味着该语句$foo = $bar
通常将数据复制$bar
到$foo
。副本是一个单独的实体,如果原件是别名,则副本本身不会是别名。在列表上下文中复制时,将复制所有元素。这意味着
my @array = @_;
做同样的事情
my @array;
$array[0] = $_[0];
# ...
这打破了所有的别名。
这实际上在 Perl 中用作“按值调用”的模式,并允许限制子例程的副作用。