別名在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