有兩個賦值操作符:列表賦值和標量賦值。該選擇基於「=
」的LHS確定。 (這兩個運營商都在here中詳細介紹。)
在這種情況下,列表賦值運算符使用。列表賦值操作符在列表上下文中評估它的兩個操作數。
那麼$_=~ /^>(.*)/
在列表上下文中做了什麼?報價perlop:
如果未使用的
/g
選項,
m//
在列表上下文返回一個由由括號中的圖案相匹配的子表達式的列表,即(
$1
,
$2
,
$3
...)[... ]模式中沒有括號時,返回值爲成功列表
(1)
。帶或不帶圓括號,失敗時返回空列表。
換句話說,
my ($match) = $_ =~ /^>(.*)/;
相當於
my $match;
if ($_ =~ /^>(.*)/) {
$match = $1;
} else {
$match = undef;
}
進行的括號省略(my $tmp = ...;
),標量分配將被代替使用。標量賦值運算符在標量上下文中評估它的兩個操作數。
那麼$_=~ /^>(.*)/
在標量上下文中做了什麼?報價perlop:
如果成功則返回true,否則返回false。
換句話說,
my $matched = $_ =~ /^>(.*)/;
相當於
my $matched;
if ($_ =~ /^>(.*)/) {
$matched = 1; # !!1 if you want to be picky.
} else {
$matched = 0; # !!0 if you want to be picky.
}
@Paul Tomblin:'$ tmp'周圍的括號至關重要,因爲它們在'=〜'操作符上強加了列表上下文。沒有它們,將根據模式匹配失敗的成功分配真或假標量值('1'或'''')。 – Borodin 2012-04-26 21:07:08
看到'$ _ =〜'真的很奇怪。這是一個衆所周知的默認設置。 – ikegami 2012-04-26 21:11:48
@ikegami我明白了。我仍然是一個perl新手。可以重寫爲'code' my($ tmp)=(/^>(.*)/); '代碼'?? – Alby 2012-04-26 21:15:28