我认为这应该很简单,在同一行的双/单引号中匹配字符串
例如,跟随字符串全部在同一行
"hello" 'world' 'foo' "bar"
我有
print /(".*?")|('.*?')/g;
但是我遇到了以下错误
Use of uninitialized value in print at ...
答案 0 :(得分:3)
以下内容将返回您提及的警告:
use strict;
use warnings;
my $str = q{"hello" 'world' 'foo' "bar"};
print $str =~ /(".*?")|('.*?')/g;
这是因为你的正则表达式只匹配捕获组中的一个或另一个。另一个将不匹配,因此将返回undef
。
以下内容将证明:
while ($str =~ /(".*?")|('.*?')/g) {
print "one = " . (defined $1 ? $1 : 'undef') . "\n";
print "two = " . (defined $2 ? $2 : 'undef') . "\n";
print "\n";
}
输出:
one = "hello"
two = undef
one = undef
two = 'world'
one = undef
two = 'foo'
one = "bar"
two = undef
要获得所需的行为,只需将捕获组放在整个表达式周围。
print $str =~ /(".*?"|'.*?')/g;
答案 1 :(得分:3)
您可能需要查看Text::ParseWords
use Text::ParseWords;
my $s = q{"hello" 'world' 'foo' "bar"};
my @words = quotewords('\s+', 0, $s);
use Data::Dumper; print Dumper \@words;
输出
$VAR1 = [
'hello',
'world',
'foo',
'bar'
];
答案 2 :(得分:-1)
使用反向引用的anoher选项:
use strict;
use warnings;
my $str = q{"hello" 'world' 'foo' "bar"};
while ($str =~ /(["']).*?\1/g) {
print $& . "\n";
}