当我使用下一个程序来解析输入文件时:
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。
答案 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。所以我得到了“无限循环”