我想只将第一个捕获组放入同一个var中。事实上,我正在寻找一个简短的形式:
$_ = $1 if m/$prefix($pattern)$suffix/;
类似的东西:
s/$prefix($pattern)$suffix/$1/a; ## Where a is the option I am looking for
甚至更好:
k/$prefix($pattern)$suffix/; ## Where k is also an option I wish I can use...
这样可以避免匹配导致更复杂行的所有文本:
s/^.*$prefix($pattern)$suffix.*$/defined $1 ? $1 : ""/e;
任何线索?
这对此示例很有用:
push @array, {id => k/.*\s* = \s* '([^']+)'.*/};
而不是
/.*\s* = \s* '([^']+)'.*/;
my $id = '';
$id = $1 if $1;
push @array, {id => $id};
修改:
我刚刚发现了一种有趣的方式,但如果未定义$1
,我将收到错误:(
$_ = (/$prefix($pattern)$suffix/)[0];
答案 0 :(得分:1)
您可以使用/r
开关返回更改后的字符串,而不是对变量进行替换。没有必要捕捉任何东西。只需删除前缀和后缀,并将该操作的结果添加到数组中。
use Data::Dump;
my @strings = qw( prefixcontent1suffix prefixcontent2suffix );
my @array = map { s/^prefix|suffix$//gr } @strings;
dd @array;
__END__
("content1", "content2")
如果您希望它是可配置的,那么:
my $prefix = qr/.+\{\{/;
my $suffix = qr/\}\}.+/;
my @strings = ( '{fo}o-_@09{{content1}}bar42' );
my @array = map { s/^$prefix|$suffix$//gr } @strings;
dd @array;
__END__
"content1"
答案 1 :(得分:1)
在列表上下文中,m//
运算符将捕获作为列表返回。这意味着你可以这样做:
($_) = m/$prefix($pattern)$suffix/;
或者这个:
my ($key, $value) = $line =~ m/^([^=]+)=([^=]+)$/;
答案 2 :(得分:1)
my $var = /$prefix($pattern)$suffix/ ? $1 : '';
在使用捕获组之前,您总是希望确保正则表达式匹配。通过使用三元组,您可以指定默认值,也可以warn
找不到匹配项。
或者,您可以在if语句中使用捕获组的列表形式,并让else输出警告:
if (my ($var) = /$prefix($pattern)$suffix/) {
...;
} else {
warn "Unable to find a match";
}