我找到了幾種將串列元素復制到哈希鍵的方法,但是有人可以解釋一下這是如何作業的嗎?
#!/usr/bin/perl
use v5.34.0;
my @arry = qw( ray bill lois shirly missy hank );
my %hash;
$hash{$_} for @arry; # What is happening here?
foreach (keys %hash) {
say "$_ => " . $hash{$_};
}
輸出是我所期望的。我不知道任務是如何進行的。
hank => 1
shirly => 1
missy => 1
bill => 1
lois => 1
ray => 1
uj5u.com熱心網友回復:
$hash{$_} for @array;
也可以寫
for (@array) {
$hash{$_} ;
}
或更明確地說
for my $key (@array) {
$hash{$key} ;
}
$_是“默認輸入和模式搜索空間”-變數。通常在 Perl 函式中,您可以省略指定要使用的顯式變數,它默認為 using $_。for就是一個例子。您還可以撰寫一個顯式變數名稱,這可能會為您的代碼提供更多資訊:
for my $word (@words)
或慣用語:
for my $key (keys %hash) # using $key variable name for hash keys
您還應該知道for和foreach在 Perl 中完全相同。它們是同一功能的別名。因此,我總是使用它,for因為它更短。
代碼的第二部分是賦值,使用自增運算子
它被附加到 LHS 上的一個變數,并將其值增加 1。例如
$_ means $_ = $_ 1
$hash{$_} means $hash{$_} = $hash{$_} 1
...etc
它還包含一定的 Perl 魔法,您可以在檔案中閱讀更多資訊。在這種情況下,這意味著它甚至可以在不發出警告的情況下增加未定義的變數。這對于初始化事先不存在的哈希鍵是理想的。
您的代碼將為@arry串列中的每個單詞初始化一個哈希鍵,并計算每個單詞的出現次數。在這種情況下恰好是 1。需要指出這一點,因為由于哈希鍵是唯一的,因此您的陣列串列可能大于哈希中的鍵串列,因為某些鍵會相互覆寫。
my @words = qw(foo bar bar baaz);
my %hash1;
for my $key (@words) {
$hash{$key} = 1; # initialize each word
}
# %hash1 = ( foo => 1, bar => 1, baaz => 1 );
# note -^^
my %hash2; # new hash
for my $key (@words) {
$hash{$key} ; # use auto-increment: words are counted
}
# %hash2 = ( foo => 1, bar => 2, baaz => 1);
# note -^^
uj5u.com熱心網友回復:
@arry 的 $hash{$_} ; # 這里發生了什么?
它遍歷陣列,并且對于每個元素,將其分配為哈希的鍵,并將該鍵的值加一。你也可以這樣寫:
my %hash;
my @array = (1, 2, 2, 3);
for my $element (@array) {
$hash{$element} ;
}
結果將是:
$VAR1 = {
'2' => 2,
'1' => 1,
'3' => 1
};
uj5u.com熱心網友回復:
$hash{$_} for @arry; # What is happening here?
閱讀perlsyn,特別是簡單的陳述句和陳述句修飾符:
簡單陳述句
唯一一種簡單的陳述句是對其副作用進行評估的運算式。每個簡單陳述句都必須以分號結尾,除非它是塊中的最后一條陳述句,在這種情況下分號是可選的。但是,如果塊占用多行,則無論如何都要加上分號,因為您最終可能會添加另一行。請注意,有類似eval {},sub {}和的運算子,do {}它們看起來像復合陳述句,但實際上并非如此——它們只是運算式中的 TERM——因此在用作陳述句中的最后一項時需要顯式終止。
陳述句修飾符
任何簡單的陳述句都可以選擇后跟一個SINGLE修飾符,就在終止分號(或塊結束)之前。可能的修飾符是:
if EXPR
unless EXPR
while EXPR
until EXPR
for LIST
foreach LIST
when EXPR
[...]
修飾符是一個迭代器:它為 LIST 中的每個專案執行一次陳述句(依次為每個專案for(each)加上別名)。$_在這種形式中,沒有語法可以指定 C 風格的 for 回圈或詞法范圍的迭代變數。
print "Hello $_!\n" for qw(world Dolly nurse);
uj5u.com熱心網友回復:
這是另一個
my %hash = map { $_ => 1 } @ary;
解釋:map一次獲取輸入陣列的一個元素,并且為每個準備一個串列,這里有兩個 - 元素本身($_由于=>也被參考)和 a 1。然后,這樣的對串列填充散列,因為可以將偶數長度的串列分配給散列,從而每兩個連續的元素形成一個鍵值對。
注意:這不考慮陣列中相同元素可能多次出現的情況,而只是建立一個存在檢查結構(元素是否在陣列中)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/483402.html
