簡體   English   中英

Perl:在替換字符串變量中使用反向引用

[英]Perl: Use backreferences in a replacement string variable

我正在 Perl 中執行字符串替換,但我將模式和替換字符串都存儲為正則表達式運算符之外的標量變量。 問題是我希望替換字符串能夠使用反向引用。

我希望下面的代碼能更清楚地說明這個問題。

my $pattern = 'I have a pet (\w+).';
my $replacement = 'My pet $1 is a good boy.';
my $original_string = 'I have a pet dog.';

# Not Working
my $new_string = $original_string =~ s/$pattern/$replacement/r;

# Working
#my $new_string = $original_string =~ s/$pattern/My pet $1 is a good boy./r;

# Expected: "My pet dog is a good boy."
# Actual: "My pet $1 is a good boy."
print "$new_string\n";
s/$pattern/My pet $1 is a good boy./

簡稱

s/$pattern/ "My pet $1 is a good boy." /e

替換表達式( "My pet $1 is a good boy." )是一個插入$1的字符串文字。


這意味着

s/$pattern/$replacement/

簡稱

s/$pattern/ "$replacement" /e

替換表達式 ( "$replacement" ) 是插入$replacement (不是$1 ) 的字符串文字。


雖然它可能會妨礙您,但perl將變量的內容作為 Perl 代碼執行,這是一件好事。 :)

您可以使用String::Substitution中的gsub_copy來解決您的問題。

use String::Subtitution qw( gsub_copy );

my $pattern         = 'I have a pet (\w+)\.';
my $replacement     = 'My pet $1 is a good boy.';
my $original_string = 'I have a pet dog.';

my $new_string = gsub_copy($original_string, $pattern, $replacement);

替換字符串中的$1只是連續的字符$1 ,並且要使其成為第一次捕獲的變量,您必須通過壞圈來 go 。

換個方式怎么樣

my string = q(a pet dog);

my $pattern = qr/a pet (\w+)/;

my $new = $string =~ s/$pattern/ repl($1) /er;


sub repl {
    my ($capture) = @_;
    return "$capture is a good boy";
}

潛艇真的只是

sub repl { "$_[0] is a good boy" }

它有點多,但它更有能力和靈活。


或者,正如 ikegami 的回答所證明的那樣,使用String::Substitution將所有涉及的“niceties”包裝到一個調用中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM