2013-09-26 25 views
3

我正在處理未註釋的Perl代碼。我遇到了一段文字,對我來說,作爲perl初學者來說,這看起來太過分了。這是一個簡單的適應:分配模式綁定操作符

my $foo; 
my $bar = "x|y|z|"; 

$bar =~ s{\|$}{}; 
($foo = $bar) =~ s{ }{}gs; 

我的理解是$bar =~ s{\|$}{}適用於裏面$bar字符串右側的正則表達式。 但是表達式($foo = $bar) =~ s{ }{}gs;是什麼意思?我不是在問正則表達式,而是在表達它的表達方式。

回答

5

只要按照該括號決定優先級,並在及時解決每個語句之一:

($a = $b) =~ s{ }{}gs; 
#^^^^^^^^--- executed first 
($a = $b)  # set $a to the value contained in $b 
$a =~ s{ }{}gs; # perform the regex on $a 

/g全球修飾符使正則表達式儘可能多的次數儘可能匹配,/s修飾符使得通配符.匹配換行符(所以它現在真的匹配一切)。 /s修飾符對於此正則表達式是多餘的,因爲其中沒有通配符.

請注意,$a$bsort所使用的預先聲明的變量,您應該避免使用它們。

如果有疑問,您可以隨時打印變量並查看它們如何變化。例如:

use Data::Dumper; 
my $x = 'foo bar'; 
(my $y = $x) =~ s{ }{}gs; 
print Dumper $x, $y; 

輸出:

$VAR1 = 'foo bar'; 
$VAR2 = 'foobar'; 
+0

感謝。在這樣的SO上被深刻的回答所掩蓋,我並沒有期望通過觀察它們如何變化來真正發現很多關於變量的變化。我的一個同志猜測「正則表達式在'$ b'上執行,但結果存儲在'$ a''中,這會導致相同的值,但我現在不知道,'$ b'被分配給'$一個「之間。 – Andre

+2

有趣的是'$ b'(或'$ x')保持不變。然而,這是一種永遠不需要使用的Perl魔法。我認爲將聲明分成兩部分可讀性更強。 – TLP

+0

關於'$ a'和'$ b'作爲「保留」變量的好處。在這種情況下,我只是將示例的實際變量重命名。 – Andre

1

但什麼是表達式($ a = $ B)= 382 4 {} {} GS;意思?

它是相同

$a = $b; 
$a =~ s{ }{}gs; 

s{ }{}gs是取代s/ //gs正則表達式與{}作爲定界符

4

在標量上下文標量分配返回其左手側的操作數(如所示here)。這意味着

$a = $b 

$b的值分配給$a並返回$a。這意味着

($a = $b) =~ s{ }{}gs; 

是短期的

$a = $b; $a =~ s{ }{}gs; 

和長

$a = $b =~ s{ }{}gsr; # Requires 5.14+ 
+1

+1,用於在'$ a = $ b =〜s {} {} gsr;中指出新的r-flag; – Andre