我有以下代碼,它使用以下代碼替換字串的一部分$1:
my $string = "abcd1234";
print "$string\n";
$string =~ s/c(d1)2/<found: $1>/;
print "$string\n";
輸出:
abcd1234
ab<found: d1>34
現在我想要包含條件和替換的變數。但是如果我這樣做,就會出現錯誤:
my $string = "abcd1234";
print "$string\n";
my $cond = qr/c(d1)2/;
my $rule = "<found: $1>";
$string =~ s/$cond/$rule/;
print "$string\n";
輸出:
Use of uninitialized value $1 in concatenation (.) or string
abcd1234
ab<found: >34
我明白了,那$1在$rule定義的行中不存在。但是如何在那里放置占位符呢?
uj5u.com熱心網友回復:
您不能像那樣延遲對帶引號的字串中的變數的解釋。 $1該行一執行就被替換。
要執行您似乎想要的操作,您可以創建一個sprintf模板并在帶有/e標志的替換部分中執行它。
my $string = "abcd1234";
print "$string\n";
my $cond = qr/c(d1)2/;
my $replacement_fmt= "<found: %s>";
$string =~ s/$cond/sprintf($replacement_fmt, $1)/e;
print "$string\n";
## ab<found: d1>34
uj5u.com熱心網友回復:
您可以使用sub_modify從String::Substitution:
use String::Substitution qw(sub_modify);
my $string = "abcd1234";
print "$string\n";
my $cond = qr/c(d1)2/;
my $rule = '<found: $1>'; # Single quotes!
sub_modify($string, $cond, $rule);
print "$string\n";
為了完整起見,請注意,它也可以做到這一點使用s///與/ee修改。但是,您不應該使用它,因為它會導致安全問題和各種錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/366848.html
上一篇:如何將一個陣列推入另一個陣列?
