我试图从替换函数中获取被替换(实际上已删除)的内容。
例如:
my $line = q{hello "my" friend "how" are 'you'};
$line =~ s/("[^"]*"|'[^']*')//g; # Removing any balanced quotes
# I'd like to print
# "my" "how" 'you'
请善待,我从Perl开始: - )。
答案 0 :(得分:5)
您可以使用/e
正则表达式修饰符来执行替换部分中的代码,其中$1
被推入@w
数组,最后被""
空字符串替换。< / p>
my @w;
$line =~ s/("[^"]*"|'[^']*')/ push @w,$1; "" /ge;
print "$_\n" for @w;
答案 1 :(得分:5)
您可以使用循环并处理每个替换,而不是使用global
替换:
my $line = qq(hello "my" friend "how" are 'you');
print "$1\n" while $line =~ s/("[^"]*"|'[^']*')//;
print "$line\n";
给出:
"my"
"how"
'you'
hello friend are
答案 2 :(得分:0)
这是另一种方式,使用内置的@-
和@+
数组来保存最新成功匹配和捕获的偏移量。
它只是找到所有匹配的子字符串,将它们保存在@removed
中并使用substr
删除它们。
use strict;
use warnings;
my $line = q{hello "my" friend "how" are 'you'};
my @removed;
while ($line =~ /("[^"]*"|'[^']*')/g) {
push @removed, $1;
substr $line, $-[0], $+[0] - $-[0], '';
}
print $line, "\n";
print "@removed\n";
<强>输出强>
hello friend are
"my" "how" 'you'