這是我的初始代碼:
sub my_sub {
my $hash = {
age => 5, # default value for "age" key
@_ # the rest of the "hash" as an array
};
...
}
#used like so:
my_sub("age" => 42, ...);
但我還想支持除了陣列之外還接受一個 hashref。所以我試過:
sub my_sub {
my $hash = {
age => 5, # default value for "age" key
ref(@_) eq "" ? @_ : %{$_[0]}
};
...
}
如果您像以前一樣使用陣列呼叫它,則ref(@_) eq ""檢查將為真,并且條件將評估為@_與以前一樣。但我這輩子都不能讓假案子起作用。目前,它表示匿名哈希中有奇數個元素。但是當我列印出的值時,%{$_[0]}我看到了預期的扁平陣列(age, 42, ...)- 換句話說,它在列印出來的背景關系中看起來是正確的,但是當它處于條件狀態時它會出錯,我不知道為什么。哈爾普。
uj5u.com熱心網友回復:
我不確定您為什么要在呼叫者中使用哈希參考,因為它只會使呼叫更加嘈雜。但是你可以使用
sub my_sub {
my %args = @_ == 1 ? %{ $_[0] } : @_;
$args{ age } //= 5;
...
}
或者
sub my_sub {
my $args = @_ == 1 ? $_[0] : { @_ };
$args->{ age } //= 5; # Warning: modifies caller
...
}
從表面上看,第二個在提供哈希參考時更快(因為它不會構建新的哈希)。但是,在實踐中,每次都會在呼叫者中創建一個新的哈希,從而取消所有好處。從好的方面來說,這也意味著修改哈希通常不會產生任何后果(由代碼段中的注釋確定的問題)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/425553.html
標籤:perl
上一篇:使用Term::Readline:Zoid時出現“ViCommand:nosuchkeymap”錯誤
下一篇:Perl5.32定義陳述句語法
