Perl 在 while 循环中挂起

Perl hangs up on while loop

此代码由于某种原因挂起,或者在查询 while (<>) { $file .= $_}; 时不再继续。这是为什么?

一旦我用输入的文本启动代码,它就不会输出 task1 然后挂起。

代码:

#!/usr/bin/perl -w

use strict;
use JSON;

my $json = JSON->new->allow_nonref;
my $file = "";

print('task1');

while (<>) { $file .= $_ };

print('task2');

my $json_output = $json->decode( $file );
my ($c, $i, $cstr, $istr);
foreach my $cert (@$json_output)  {

        print('task3');
        $i = $json_output->{i};
        $c = $json_output->{c};

        $istr = join("", map { sprintf("%02x",$_) } @$i);
        $cstr = pack("C*", @$c);
        open(F, ">$istr.der"); print F $cstr; close(F);
        print('done.');

}

输出:

task1

你如何调用你的代码? <> 运算符意味着它从您指定为参数的所有文件或标准输入中获取输入。如果您不带任何参数调用脚本,它将等待控制台输入。

如果你不带参数调用它,尝试在它“挂起”时输入几行文本,然后输入Ctrl+D 如果你在 Linux,或者 Ctrl+Z 在 Windows。这应该使脚本工作。

这一行

while (<>) { $file .= $_ };

正在尝试从命令行指定的文件中读取,如果没有,则从标准输入中读取。如果没有任何内容通过管道传输到标准输入,那么它将等待您在键盘上输入内容。

所以我猜您没有在命令行中指定文件,您的程序正等待从标准输入中获取输入。

此外,将整个文件读入单个变量的更简单方法如下:

my $file = do { local $/; <> };

有关其他选项,请参阅 this article