我正在學習 Perl 語言,我偶然發現了以下問題:是否可以在替換引數中使用反向參考作為鍵,例如:
$hm{"Cat"} = "Dog";
while(<>){
s/Cat/$hm{\1}/
print;
}
也就是說,我想告訴 Perl 查找包含在捕獲引數中的鍵。
我知道這是一個愚蠢的例子。但我只是好奇是否可以在替換中使用這種帶有反向參考的鍵查找。
uj5u.com熱心網友回復:
改為使用$1。
雖然反向參考喜歡\1在正則運算式的替換部分作業,但它只在字串背景關系中作業。is 訪問散列中的$hm{KEY}專案。KEY 部分可以是裸詞或運算式。在運算式中,\1將是“對帶有 value 的文字標量的參考1”,它將字串化為SCALAR(0x55776153ecb0),而不是字串中的反向參考。相反,我們可以在正則運算式中使用諸如$1.
但這需要我們捕獲正則運算式的一部分。我會把它寫成:
s/(Cat)/$hm{$1}/;
根據經驗,僅\1 在正則運算式模式中使用反向參考。其他任何地方都使用捕獲變數,例如$1. 如果你use warnings,Perl 也會告訴你\1 better written as $1,雖然它不會檢測到你的情況下的特定問題,因為它\1仍然是有效的語法,盡管具有不同的含義。
uj5u.com熱心網友回復:
如果您正在查看非常舊的代碼,您會看到人們\1在替換的替換端使用表單。有時你會在真正的新代碼中看到它;這是 Perl 4 仍然有效的東西,但是Perl 5 添加了一個警告。如果你打開了警告,perl 會告訴你(雖然我不知道這個警告是什么時候開始的:
$ perl5.36.0 -wpe 's/cat(dog)/\1/'
\1 better written as $1 at -e line 1.
通過診斷,您可以獲得有關警告的更多資訊:
$ perl5.36.0 -Mdiagnostics -wpe 's/cat(dog)/\1/'
\1 better written as $1 at -e line 1 (#1)
(W syntax) Outside of patterns, backreferences live on as variables.
The use of backslashes is grandfathered on the right-hand side of a
substitution, but stylistically it's better to use the variable form
because other Perl programmers will expect it, and it works better if
there are more than 9 backreferences.
Perl 使用許多其他警告來向您展示做事的更好方法。
高于此水平的是perlcritic,這是一套關于某些人認為是好的風格的固執己見的政策。在您對什么對您或您的團隊有效的想法形成自己的想法之前,這并不是一個糟糕的起點。
uj5u.com熱心網友回復:
有人解釋說,人們想為此使用捕獲,而不是反向參考,例如
perl -wE'$_=shift//q(hal); %h = (a => 7); s/(a)/$h{$1}/; say'
我想補充的是,如果實際上沒有用于該捕獲的密鑰怎么辦?
我們經常捕獲復雜的模式,而不是簡單的文字,并且我們預期的密鑰可能無法涵蓋可能出現的所有情況。一種檢查方法涉及修飾符 /e,它使替換部分被評估為代碼,然后將其回傳替換為字串
perl -wE'$_=shift//q(hal); %h = (a => 7); s{(h)}{$h{$1} // "some default"}e; say'
現在,如果匹配并捕獲了模式但不是鍵 ( ),則替換h字串。some default默認情況下通常明智的選擇是捕獲本身(如果不是鍵,只需將其放回原處)。
請注意,替換部分現在必須是語法正確的代碼,因此沒有文字字串等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/486986.html
下一篇:有沒有辦法檢查VCS中嵌套檔案的語法是否正確,讓他們知道誰是父級?就像在Perl中用require或eval呼叫一樣?
