我有幾個捕獲的正則運算式,顯然捕獲變數保留了最后一次有效捕獲的值:
# Two scalars to use for regexp
$x = 'abc';
$y = 'def';
# first regexp
$x =~ /^(ab)/;
$x = $1;
# second regexp
$y =~ /^(de)/;
$y = $1;
print \"$x\n$y\";
輸出是:
ab
de
這里是單行版本:
perl -e "$x='abc'; $y='def'; $x =~ /^(ab)/; $x=$1; $y =~ /^(de)/; $y=$1; print \"$x\n$y\";"
如果$y='def'改為$y='zdef':
perl -e "$x='abc'; $y='zdef'; $x =~ /^(ab)/; $x=$1; $y =~ /^(de)/; $y=$1; print \"$x\n$y\";"
輸出是:
ab
ab
如果我想設定$1=undef后$x=$1洗掉 $1 中的當前值
perl -e "$x='abc'; $y='zdef'; $x =~ /^(ab)/; $x=$1; $1=undef; $y =~ /^(de)/; $y=$1; print \"$x\n$y\";"
輸出是:
Modification of a read-only value attempted at -e line 1.
顯然,捕獲變數是無法更改的。
我想知道如何解決這個問題。我想要的結果是:
ab
..
where 的..意思是“空的”。就像在這種情況下,第一個正則運算式是 undef ( $x='zabc):
perl -e "$x='zabc'; $y='def'; $x =~ /^(ab)/; $x=$1; $y =~ /^(de)/; $y=$1; print \"$x\n$y\";"
..
de
uj5u.com熱心網友回復:
您需要謹慎使用捕獲變數$1(和$2、、$3等)。它們在成功的模式匹配時分配(并且未分配),因此您必須確保您有正確的匹配。通常,您會這樣做:
if ('abc' =~ /^(ab)/) {
$x = $1;
}
if ('zdef' =~ /^(de)/) {
$y = $1;
}
這樣,您永遠不會得到錯誤的分配值。
但是,還有其他方法可以做到這一點。模式匹配本身會給出一個回傳值,這取決于背景關系。
$n = 'abc' =~ /^(ab)/; # $n = 1 for "true". This is scalar context
($n) = 'abc' =~ /^(ab)/; # $n = 'ab', the captured string. This is list context
$n = () = 'abc' =~ /(.)/g; # $n = 3, for 3 matches. /g gives multiple matches
($f, $g) = 'abc' =~ /(.)/g; # $f = 'a', $g = 'b'. List context
uj5u.com熱心網友回復:
perl 正則運算式通常使用全域變數。如果沒有捕獲,$1 將是最后一個成功捕獲的組。
正如我所說,它很常見,并且是 perl 的作業方式。
你能做什么?首先,讓所有捕獲的組排列如下:
@captures = $y =~ /^(de)/;
然后使用它。
其次,使用 ternar 陳述句:
$y = $y =~ /(ho)/ ? $1 : undef;
或者你可以考慮這個包https://metacpan.org/pod/Regex::Object 它對這類事情有幫助。但是您需要一些關于 CPAN 和物件的基本知識。
uj5u.com熱心網友回復:
代替
$x =~ /^(ab)/;
$x = $1;
和
( $x ) = $x =~ /^(ab)/;
或者
$x = $x =~ /^(ab)/ ? $1 : undef;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/417076.html
標籤:
上一篇:RabitMQ 簡介
下一篇:DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ | TORCH.AUTOGRAD
