Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex perl正则表达式将所有匹配项放入一个数组,包括完全匹配项_Regex_Perl - Fatal编程技术网

Regex perl正则表达式将所有匹配项放入一个数组,包括完全匹配项

Regex perl正则表达式将所有匹配项放入一个数组,包括完全匹配项,regex,perl,Regex,Perl,我有以下perl代码: use Data::Dumper; $key = 'foobar:foo:bar'; $pattern = '^[^:]+:([a-z]{3}):(.+)$'; my @matches = $key =~ /$pattern/i; print Dumper(@matches); 输出: $VAR1 = 'foo'; $VAR2 = 'bar'; 或者,我可以为第一个捕获组打印$1,为第二个捕获组打印$2 我想知道的是如何获得完整的模式匹配。例如,在PHP中,如果我使用

我有以下perl代码:

use Data::Dumper;
$key = 'foobar:foo:bar';
$pattern = '^[^:]+:([a-z]{3}):(.+)$';
my @matches = $key =~ /$pattern/i;
print Dumper(@matches);
输出:

$VAR1 = 'foo';
$VAR2 = 'bar';
或者,我可以为第一个捕获组打印$1,为第二个捕获组打印$2

我想知道的是如何获得完整的模式匹配。例如,在PHP中,如果我使用
preg_match
,我会得到以下结果:

Array
(
    [0] => foobar:foo:bar
    [1] => foo
    [2] => bar
)

其中第一个元素(或$0或\0)是完全匹配的。我如何在Perl中得到它

用括号开始和结束正则表达式,并使整个表达式成为另一个捕获组

my @matches = $key =~ /($pattern)/i;

print Dumper( ["foobar:foo:bar"=~/$pattern/i] );
$VAR1 = [
      'foo',
      'bar'
    ];

print Dumper( ["foobar:foo:bar"=~/($pattern)/i] );
$VAR1 = [
      'foobar:foo:bar',
      'foo',
      'bar'
    ];

您可以使用
$&
${^MATCH}
变量,尽管在5.20之前的Perl版本中存在性能损失(对于
$&
)。发件人:

  • $MATCH
  • $&
最后一次成功模式匹配匹配的字符串(不计算隐藏在块中的任何匹配或当前块包含的
eval()

[……]

  • ${^MATCH}
这与
$&
$MATCH
)类似,只是它不会导致与该变量相关的性能损失

[……]

在PerlV5.18及更早版本中,只有在使用
/p
修饰符编译或执行模式时,才能保证返回定义的值。在PerlV5.20中,
/p
修饰符不做任何事情,因此
${^MATCH}
做的事情与
$MATCH
做的事情相同

这个变量是在PerlV5.10.0中添加的

性能问题 同样来自:

传统上,在Perl中,在代码中的任意位置使用三个变量
$`
$&
$'
(或它们的
使用英语
等价物)中的任何一个都会导致所有后续成功的模式匹配生成匹配字符串的副本,以防代码随后可能访问其中一个变量。这在整个程序中造成了相当大的性能损失,因此通常不鼓励使用这些变量

[……]

在Perl 5.10.0中引入了
/p
匹配运算符标志和
${^PREMATCH}
${^match}
${^POSTMATCH}
变量,这些变量只允许您在标记有
/p
的模式上受到惩罚

在Perl 5.18.0以后的版本中,Perl开始分别注意到三个变量中的每一个变量的存在,并且只复制所需字符串的那一部分;所以在

$`; $&; "abcdefgh" =~ /d/
perl只会复制字符串的“abcd”部分。这可能会在以下方面产生很大的不同

$str = 'x' x 1_000_000;
$&; # whoops
$str =~ /x/g # one char copied a million times, not a million chars
在Perl 5.20.0中,默认情况下启用了一个新的写时拷贝系统,这最终解决了这三个变量的所有性能问题,并使它们可以安全地在任何地方使用

例子: 输出:
或者,您可以使用
@-
@+
变量,它们给出了成功匹配的索引,并且没有
$&
${^MATCH}
那样的性能影响,但是我认为它们使用起来有点麻烦。这些也记录在perlvar中。
perl -wE 'say for "foo:bar" =~ /^(\w+):(\w+)$/p; say ${^MATCH}'
foo
bar
foo:bar