Command-Line
Perl 命令行正則表達式修改所有模式匹配
我正在嘗試對
perl
命令行中的匹配模式使用一些算術。我能夠為一場比賽做到這一點,但不是全部。str="a1b2c3" perl -pe 's/\d+/$&+1/e' <<<"$str" a2b2c3
我理解這裡
$&
指的是第一個匹配的數字1
。我需要做什麼才能添加1
到所有數字?是否有一個類似於$&
代表所有匹配模式的變數?或者需要修改正則表達式以匹配多個數字。對於給定的輸入,我期望輸出類似於
a2b3c4
str="a1b2c3" perl -pe 's/\d+/$&+1/ge' <<<"$str"
g
替換標誌將使 Perl 為輸入行上的每個非重疊匹配應用表達式。Nitpick:這裡實際上沒有涉及擷取組(原始問題提到了擷取組)。Perl 變數
$&
是“由最後一次成功的模式匹配匹配的字元串”。這與引用對應擷取組匹配的字元串(帶括號的表達式)的 eg 等$1
不同。$2
中沒有擷取組\d+
,但您可以使用s/(\d+)/$1+1/ge
它,它確實使用單個擷取組。
s/(\d+)/$1+1/ge
結果和結果之間沒有區別s/\d+/$&+1/ge
。在這個簡短的內嵌 Perl 腳本中,您選擇使用其中一個沒有區別,但通常您希望避免$&
在執行許多正則表達式操作的較長 Perl 程序中使用,至少在使用較舊的 Perl 時釋放。來自
perldoc perlvar
(我的重點):性能問題
傳統上,在 Perl 中,任何使用三個變數中的任何一個
$``,
$&或者
$’(或它們的
use English`等價物)在程式碼中的任何地方,都會導致所有後續成功的模式匹配複製匹配的字元串,以防程式碼隨後訪問其中一個變數. 這對整個程序造成了相當大的性能損失,因此通常不鼓勵使用這些變數。$$ … $$ 在 Perl 5.20.0 中,預設啟用了一個新的寫時複製系統,它最終修復了這三個變數的所有性能問題,並使它們在任何地方都可以安全使用。