Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么有些程序员声明变量,比如my$myvariable=shift;用Perl?_Perl - Fatal编程技术网

为什么有些程序员声明变量,比如my$myvariable=shift;用Perl?

为什么有些程序员声明变量,比如my$myvariable=shift;用Perl?,perl,Perl,我一直在关注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 ); 结果是未定义的 为什么你不能只用 my $num_disks = 9; my $source;

我一直在关注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 ); 
结果是未定义的

为什么你不能只用

my $num_disks = 9;
my $source;
my $dest;
my $how_many;

要声明变量?

shift
是一个函数,它接受数组,删除数组的第一个元素并返回该元素。如果数组为空,则返回
undef
。如果shift未获得任何参数,则在子例程内部时,它会自动在
@
数组上工作(否则它使用
@ARGV

函数的参数放置在数组
@

因此,如果我们编写一个包含两个参数的函数,我们可以使用shift键两次将它们放入变量中:

sub add {
    my $a = shift;
    my $b = shift;
    return $a + $b;
}
现在add(3,4)将返回7

符号

my $a = shift || 1;
只是一个逻辑or。这意味着如果
shift
的结果是falsy(例如,未定义、零或空字符串),则使用值1。这是给函数参数设置默认值的常用方法

my $a = shift // 1;

与前面的示例类似,但它仅在
shift()
返回
undef
时指定默认值。我想第一步是找出
shift
在Perl中的作用?那么您就缺少了默认情况下
shift
@
进行操作的功能,这是sub存储参数的地方。它从参数列表中弹出参数。如果arglist没有更多的arg,则使用
|
操作符设置默认值。@DanLowe为什么使用
my$num|u disks=shift | | 9外部array@BenWhite
@
是一个数组。@DanLowe:“那么默认情况下,
shift
@
进行操作时,您将丢失该数组。”。从学究的角度讲,这只在子程序中才是正确的。在子例程之外,
shift
默认在
@ARGV
上工作。啊,太好了,我错过了一个事实,即@uu包含函数的参数
shift
的结果是falsy(例如,unde、zero或空字符串),我认为零不应该在那里,因为如果我们在子例程add中传递
0
,它将把它作为
0
并返回
4
。但无论如何不要使用$a和$b作为函数参数,它是为函数保留的。:)