繁体   English   中英

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

[英]Confused about whether I'm passing a scalar or an array to a subroutine in perl?

我刚刚开始学习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' );

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

这意味着第一个子例程参数在$_[0] ,第二个子例程存储在$_[1] ,依此类推。 但是-这里是一个重要的注意事项-这些变量都毫无关系与$_变量,任何超过$dino[3]的元素@dino阵列)具有做$dino (一个完全不同的标量变量)。 只是参数列表必须在某个数组变量中才能使子程序使用它,而Perl为此目的使用@_

学习Perl,第6版,第4章

所以当你应该使用my $name = $_[0];时,你可能会错误地使用$_ my $name = $_[0]; ,或my $name = shift @_; 为方便起见,当你是一个子程序内, shift默认为关闭的换挡@_如果您提供没有明确的说法,所以常见的成语是说my $name = shift;

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

以下是perlintro的简短片段:

那是什么shift 好吧,子程序的参数可以作为一个名为@_的特殊数组使用(有关详细信息,请参阅perlvar )。 shift函数的默认参数恰好是@_ 所以my $logmessage = shift; 将第一项移出参数列表并将其分配给$logmessage

听起来你已经跳过了章节的一部分。 您是否阅读了关于参数的部分(最新的第六版第66页)。 它说

Perl将列表传递给子例程; 也就是说,Perl使列表可用于子程序,但需要使用。 当然,您必须将此列表存储在某处,因此Perl会在子例程的持续时间内自动将参数列表(参数列表的另一个名称)存储在名为@_的特殊数组变量中。 您可以访问此数组以确定参数的数量和这些参数的值。

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

所有perl子例程的参数都存在于一个参数数组中,您的书无法提及。

这个数组@_ ,并在你的情况下,通过shift你将得到你的第一个参数,这将是一个标量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM