perl:如何从预编译版本获取原始正则表达式?
简单代码:perl:如何从预编译版本获取原始正则表达式?,perl,Perl,简单代码: use 5.014; use warnings; my $re = <DATA>; chomp $re; my $re2 = qr/$re/; say $re2; __END__ ^\w$ 有没有正确的方法来反编译$re2以返回原始正则表达式 动机:正则表达式是一个配置值,因此需要: 读一下 编译它 将其保存到文件中供以后使用 但无法保存已编译的正则表达式以供以后使用,因为在每次编译中,正则表达式都会用(?^u:)展开,因此在几个循环后,我以like结束: (?^
use 5.014;
use warnings;
my $re = <DATA>;
chomp $re;
my $re2 = qr/$re/;
say $re2;
__END__
^\w$
有没有正确的方法来反编译$re2以返回原始正则表达式
动机:正则表达式是一个配置值,因此需要:
- 读一下
- 编译它
- 将其保存到文件中供以后使用
(?^u:(?^u:(?^u:(?^u:(?^u:^\w$)))))
因此,问题是:
- 这里有没有正确的方法,如何保存编译后的版本
- 如果没有办法-如何反编译,以获得原始版本
- 有什么想法吗
感谢您指出这一点。虽然我只是保留字符串副本以供数据使用,然后在需要时编译副本,但您也可以使用core
re
模块中的函数返回用于创建已编译正则表达式的模式:
use re 'regexp_pattern';
print regexp_pattern qr/^\w$/;
印刷品
^\w$
也许简单到:
...
($reoriginal = $re2) =~ s{^\(\?.+:(.+)\)}{$1};
say $reoriginal
原始的是运算符,而不是正则表达式模式。仅查看由regexp\u模式返回的第一个值(模式)会导致信息丢失。您还需要查看第二个值(标志)
要尽可能接近原始操作符,您需要
use re qw( regexp_pattern );
my ($pat, $flags) = regexp_pattern($re);
$pat =~ s{/}{\\/}g;
say qq{qr/$pat/$flags};
注意,版本不一致:这正是我需要的。在5.10以上使用perl-太好了…;)THANX!这不是它打印的内容,至少不是在5.14中。@ikegami=>我这里有5.10.1在工作,这正是它打印的内容。此外,它不会因qr/foo\/bar/
而失败。它只是返回一个不符合引用字符的值……从文档中:在列表上下文中,它返回一个两元素列表,第一个元素包含模式,第二个元素包含编译模式时使用的修饰符。
测试时,我发现上面提到的两个例子打印了一个列表,其中第二个元素是u
。Thanx daxim也是-不幸的是,只能接受一个..你说你从一个文件中读取了模式,所以你有你想要保存到一个文件中的东西,那么为什么不保存它呢?我正在编译没有标志的正则表达式,所以Erics简单版本对我来说就足够了。无论如何,非常感谢您的详细解释@jm666,同样,如果您知道这一点,为什么需要从re中提取原始模式?
qr/foo/ # pat: foo flags: u
qr/foo/u # pat: foo flags: u
use re '/u'; qr/foo/ # pat: foo flags: u
qr/foo/a # pat: foo flags: a
use re '/a'; qr/foo/ # pat: foo flags: a
qr/foo/i # pat: foo flags: ui
use re '/i'; qr/foo/ # pat: foo flags: ui
use re '/a'; qr/foo/i # pat: foo flags: ai
use re '/ai'; qr/foo/ # pat: foo flags: ai
use re qw( regexp_pattern );
my ($pat, $flags) = regexp_pattern($re);
$pat =~ s{/}{\\/}g;
say qq{qr/$pat/$flags};