我一直在关注perlmeme.org上的教程,一些作者以下列方式声明变量:
my $num_disks = shift || 9; # - no idea what the shift does
并在循环中
my $source = shift;
my $dest = shift;
my $how_many = shift;
使用时
print Dumper ( $source );
结果是undef
为什么不能只使用
my $num_disks = 9;
my $source;
my $dest;
my $how_many;
声明变量?
答案 0 :(得分:11)
shift
是一个接受数组的函数,删除它的第一个元素并返回该元素。如果数组为空,则返回undef
。如果shift没有参数,那么它在子程序内部时会自动在@_
数组上运行(否则它使用@ARGV
)。
函数的参数放在数组@_
中。
因此,如果我们编写一个带有两个参数的函数,我们可以使用shift两次将它们放入变量中:
sub add {
my $a = shift;
my $b = shift;
return $a + $b;
}
现在添加(3,4)将返回7.
符号
my $a = shift || 1;
只是一个逻辑或。这表示如果shift
的结果是假的(例如,undef,零或空字符串),则使用值1.这是给函数参数提供默认值的常用方法。
my $a = shift // 1;
与上一个示例类似,但仅当shift()
返回undef
时才会指定默认值。