为什么我在进行正则表达式匹配时会得到无限循环?

时间:2016-05-02 08:52:06

标签: regex perl

当我使用下一个程序来解析输入文件时:

my $content =  "@{[ <> ]}";
@cts =  $content =~ m/^CREATE TABLE .*? \(\n.*?\);$/gsm;
print @cts;

一切正常,但这(第二次)没有结束:

my $content =  "@{[ <> ]}";
@cts =  "@{[ <> ]}" =~ m/^CREATE TABLE .*? \(\n.*?\);$/gsm;
print @cts;

UPD
perlop

  

null文件句柄&lt;&gt;很特别:它可以用来模拟sed和awk的行为,以及任何其他带有文件名列表的Unix过滤器程序,对所有输入的每一行做同样的事情。来自&lt;&gt;的输入来自标准输入,或来自命令行中列出的每个文件

当我运行脚本时,第二种情况有 UNEXPECTED 没有输出:

./prepare_migration.pl < psql.schema3

当我运行脚本时,第二种情况有 UNEXPECTED 无限循环(从STDIN等待输入):

./prepare_migration.pl psql.schema3

但是对于第一种情况,运行程序的两个变体都可以正常工作并产生相同的输出。也没有任何等待STDIN。

2 个答案:

答案 0 :(得分:2)

似乎最有可能是您将输入文件作为第一个程序的参数提供,但是在运行第二个程序时您没有。否则没有实质性差异。

答案 1 :(得分:0)

感谢@ThisSuitIsBlackNot。当我做“最小,完整,可验证的例子”时,我发现了错误。我忘了评论行

my $content =  "@{[ <> ]}"; # <<---  I SHOULD COMMENT THIS
@cts =  "@{[ <> ]}" =~ m/CREATE TABLE .*? \(\n.*?\);\n/gsm;
print @cts;

所以当我./prepare_migration.pl < psql.schema3时,@ ARGV文件句柄为空,没有什么可读的。所以@cts为空。

当我./prepare_migration.pl psql.schema3时,@ ARGV文件句柄是'psql.schema3'。内容读取为$ content。对于第二个 readline &lt;&gt;运算符绑定到STDIN。所以我得到了“无限循环”