[英]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.