2012-04-26 46 views
2

以下是許多很酷的事情Perl可以做你能解釋一下上下文相關的變量賦值在Perl

my ($tmp) = ($_=~ /^>(.*)/); 

一個它發現的模式^>。*在當前行中循環,並在$ tmp變量中存儲括號中的內容。

我很好奇的是這個語法背後的概念。這項工作如何以及爲什麼(在什麼前提下)? 我的理解是代碼片段$ _ =〜/^>(.*)/是一個布爾上下文,但括號將它作爲列表上下文呈現?但是,只有匹配模式括號中的內容才存儲在變量中?!

是否需要「記憶」變量賦值的某種特殊情況,還是可以完全解釋的?如果是的話,這個功能稱爲什麼(名稱像「autovivifacation?」)

+0

@Paul Tomblin:'$ tmp'周圍的括號至關重要,因爲它們在'=〜'操作符上強加了列表上下文。沒有它們,將根據模式匹配失敗的成功分配真或假標量值('1'或'''')。 – Borodin 2012-04-26 21:07:08

+0

看到'$ _ =〜'真的很奇怪。這是一個衆所周知的默認設置。 – ikegami 2012-04-26 21:11:48

+0

@ikegami我明白了。我仍然是一個perl新手。可以重寫爲'code' my($ tmp)=(/^>(.*)/); '代碼'?? – Alby 2012-04-26 21:15:28

回答

5

有兩個賦值操作符:列表賦值和標量賦值。該選擇基於「=」的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. 
} 
2

搜索模式中的括號使其成爲「組」。 $_ =~ /regex/返回的是所有匹配組的數組,因此my ($tmp)將第一個組抓取到$ tmp。

+0

如果正則表達式中沒有括號,它會返回什麼? – Alby 2012-04-26 21:07:02

+1

@Alby,'(1)'成功。 '()'如果匹配失敗(是否捕獲使用或不使用)。 – ikegami 2012-04-26 21:09:08

+0

@ikegami謝謝!因此,總而言之,如果至少有一個由括號包圍的子表達式,它將返回子表達式的列表,如果沒有任何子表達式,則返回1或0,取決於整個匹配的成功與否正則表達式。我對麼? – Alby 2012-04-26 21:13:54

1

在Perl中的所有操作有返回值,包括轉讓。這就是爲什麼你可以做$a=$b=1並將$a設置爲$b=1的結果。

您可以在布爾(井標量)上下文中使用=~,但這僅僅是因爲如果沒有匹配並且計算結果爲false,它會返回空列表/ undef。在數組上下文中調用它將返回一個數組,就像其他上下文相關函數可以使用wantarray方法來確定上下文一樣。

相關問題