Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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
perl:如何从预编译版本获取原始正则表达式?_Perl - Fatal编程技术网

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:)展开,因此在几个循环后,我以like结束:

(?^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};