对于我是否将标量或数组传递给perl中的子例程感到困惑?

goz*_*ozu 4 arrays perl scalar shift subroutine

我刚刚开始学习perl,我对此练习感到困惑(来自Learning Perl第4章).

在greet()子例程的开头,我试图将参数$ _分配给我的$ name(我的$ name = $ _)变量,但它不起作用.这本书说要用"我的名字=班次"; 但我不明白为什么.shift用于从数组中删除一个值,据我所知,我的参数不是一个数组,它是一个标量内的字符串!

谁能解释一下我不理解的东西?

谢谢!这是整个代码.

use 5.012;
use warnings;
use utf8;

sub greet {
   my $name = $_;
   state $last_person ;
   if (defined $last_person ) {
          print "Hi $name! $last_person is also here!\n";

   } else {
          print "Hi $name! You are the first one here!\n";
   }
   $last_person = $name;
}

greet( 'Fred' );
greet( 'Barney' );
greet( 'Wilma' );
greet( 'Betty' );
Run Code Online (Sandbox Code Playgroud)

Dav*_*idO 8

在Learning Perl(第6版)的第4章中,有一个名为Arguments的部分.在那里它陈述如下:

这意味着第一个子例程参数在$_[0],第二个子例程存储在其中$_[1],依此类推.但是 - 这是一个重要的注意事项 - 这些变量与变量没有任何关系, $_只不过$dino[3](@dino 数组的一个元素)与$dino(一个完全不同的标量变量)有关.只是参数列表必须在某个数组变量中供您的子程序使用,而Perl使用它@_来实现此目的.

(学习Perl,第6版,第4章)

所以$_当你应该使用时,你可能会错误地使用my $name = $_[0];,或者my $name = shift @_;.为方便起见,当你在一个子程序中shift时,@_如果你没有提供明确的参数,则默认为偏离,所以常见的习惯就是说my $name = shift;.

对于那些需要其他资源的人来说,perldoc perlintro对于将参数传递给子程序并通过@_或访问它们也有一个很好的(并且适当简要)解释shift.

这是一个简短的片段perlintro:

那是什么shift?好吧,子程序的参数可以作为一个特殊的数组调用@_(参见perlvar更多内容).该shift函数的默认参数恰好是@_.因此,my $logmessage = shift;将第一个项目移出参数列表并将其分配给$logmessage.