之后split,我得到一個@digits值為 的陣列 1 2 4 8 16 32 64。但是,我無法理解它在 block 中的處理機制if ($digits [-1] == 4) {}。之后,只有4 6 4值保留在同一個陣列中。是的,我看到這段代碼可以正常作業,但是如何在不處理它的情況下從陣列中洗掉不必要的值?
my @input_numbers = qw(1 2 4 8 16 32 64);
my @result = map {
my @digits = split //, $_;
if ($digits[-1] == 4) {
@digits;
} else {
( );
}
} @input_numbers;
print join(" ", @result); # 4 6 4
uj5u.com熱心網友回復:
映射的作業原理是一次獲取其輸入串列中的一個元素,運行帶有該元素 in 的塊中的代碼$_,并回傳最后一個評估陳述句(回傳)所做的任何事情。這些回傳值在處理輸入串列的所有元素后,構成其輸出串列。
因此@digits,您的塊中的 每次迭代都會分配(字串)當前處理的元素的數字,而不是所有元素的所有數字。? 然后它們要么在串列中回傳,要么回傳一個空串列,從而在整個回傳串列中“消失”。?
由于您在最后一個是 時從塊中回傳帶有這些數字的串列4,因此當您的map塊處理4(陣列中的第三個元素)時,它回傳4,并且在處理64時回傳帶有其數字的串列,6并且4。總而言之4 6 4。
? 這也可能有助于意識到map { ... } LIST語法中的塊代表子例程呼叫,其中對每個元素執行此類代碼。這是通過使用原型來實作的。請注意,建議不要隨意使用原型,但在這里需要它們。
這不能在純 Perl 中完全實作,但這里有一個簡單的例子
sub a_bit_like_map :prototype(&$) {
my ($code, @in) = @_;
my @res;
foreach my $el (@in) {
local $_ = $el;
push @res, $code->($el);
}
return @res
}
現在這可以稱為
my @mapped = a_bit_like_map( sub { ... }, LIST );
my @mapped = a_bit_like_map { ... } LIST;
此:prototype屬性在較新的 Perls 中是必需的,并且在其中啟用了簽名,因為沒有它,語法將與簽名的語法發生沖突。
對于較舊的 Perls,您會看到它們用作sub func(&@) { ... }.
? 也map可用作過濾器
uj5u.com熱心網友回復:
這里有兩件事。map在串列背景關系中評估其代碼。
其次,一個塊回傳其最后評估的運算式。
在您的map中,最后一個評估的運算式來自iforelse塊,因為沒有其他陳述句超過該結構。如果是這種if情況,它會回傳@digits,這會將一個或多個新專案添加到map的輸出串列中。
在這種else情況下,最后評估的運算式是( ),它是空串列。這不會向輸出串列添加新元素,因此“排除”該特定輸入元素的結果。
我可能會把這個任務寫成一個串列管道。grep選擇我們知道要處理的元素,然后處理map它獲得的所有內容:
my @result = map { split // } grep { /4\z/ } @input_numbers;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/506236.html
標籤:perl
上一篇:需要Perl語法的說明
下一篇:將翻譯限制為短語中的一個單詞?
