Perl匹配同一行上的多个字符串(双引号和单引号内的任何内容)

时间:2014-04-04 05:41:00

标签: regex perl

我认为这应该很简单,在同一行的双/单引号中匹配字符串

例如,跟随字符串全部在同一行

"hello" 'world' 'foo' "bar"

我有 print /(".*?")|('.*?')/g;

但是我遇到了以下错误

Use of uninitialized value in print at ...

3 个答案:

答案 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";
}