Jac*_*lin 2 regex arrays perl push
我在脚本中定义正则表达式,使用qr并将它们推送到数组上。但现在看来,如果我不将正则表达式放在双引号内,将它推到数组上的操作会改变它。例子:
#!/usr/bin/perl
use strict; use warnings;
use Data::Dumper qw(Dumper);
use Data::Dumper::Concise;
my @regexes;
my $rgx = 'dog'; my $mdf = 'i';
$rgx = join ( '', '(?', $mdf, ')', $rgx ) if ($mdf); # in production, $mdf could be empty
eval { $rgx = qr/$rgx/ };
if ($@) # catch illegitimate regex modifier, such as 'g'
{
die "rgx==$rgx; mdf==$mdf; qr throws an error";
}
push @regexes, $rgx;
push @regexes, "$rgx";
print "first try just printing \$rgx\n";
print " no double quotes:";
print $rgx; print "\n";
print "yes double quotes:";
print "$rgx"; print "\n";
print "but now see what happens when I push it onto an array\n";
print Dumper \@regexes;
Run Code Online (Sandbox Code Playgroud)
这会产生什么:
first try just printing $rgx
no double quotes:(?^:(?i)dog)
yes double quotes:(?^:(?i)dog)
but now see what happens when I push it onto an array
[
qr/(?i)dog/i,
"(?^:(?i)dog)"
]
Run Code Online (Sandbox Code Playgroud)
我以为这(?^:(?i)dog)是一个成品,准备好进行正则表达式匹配,例如
if ( /$rgx/ )
Run Code Online (Sandbox Code Playgroud)
事实上,这就是为什么我通过qr.
为什么会push改变呢?
为什么它会产生特定的语法,
qr/(?i)dog/i?
您实际上是在询问返回的值之间的差异
my $rgx = qr/$rgx/; $rgx
Run Code Online (Sandbox Code Playgroud)
和
my $rgx = qr/$rgx/; "$rgx"
Run Code Online (Sandbox Code Playgroud)
qr//编译提供的正则表达式模式并返回一个表示编译形式的对象。这是存储在变量中的值$rgx,由表达式返回$rgx。
""构建一个字符串,因此"$rgx"提供$rgx. 值得庆幸的是,这会返回一个字符串,该字符串可用作编译对象表示的正则表达式模式。但是,通过执行"$rgx",您可以有效地撤消 所做的工作qr/$rgx/。
Data::Dumper 使用qr//文字表示正则表达式对象,使用文字表示字符串""。