在Perl 5.12.1上正常工作的代码在5.10.0上不起作用

pow*_*boy 4 perl

我写了一些代码(大约100行),在5.12.1版本上工作正常.不幸的是我的客户端使用的是版本5.10.0.所以我测试了5.10.0上的代码,发现它不起作用!

我在哪里可以找到5.10和5.12之间的差异列表?


编辑:

我认为"在哪里可以找到5.10和5.12之间的差异列表"问题的最佳答案是"已接受答案"下的" plusplus "评论.有关下面代码的解释,请阅读Michael Carman的回答.


代码适用于5.12.1但不适用于5.10.0($contents运行代码后仍为空字符串)

# read in the first 10 lines.
my $contents = '';
for (my $i = 0; $i < 10 && ! eof; $i++) {
    $contents .= <FILE>;
}
Run Code Online (Sandbox Code Playgroud)

适用于这两个版本的改进代码.

# read in the first 10 lines.
my $contents = '';
my $i = 0;
while (<FILE>) {
    last if $i >= 10;
    $contents .= $_;
    $i++;
} 
Run Code Online (Sandbox Code Playgroud)

Mic*_*man 9

你的第一个代码示例中有一个错误.eof读取最后一个文件句柄的裸报告状态.在第一次通过循环时,你(可能)还没有读过任何东西; FILE反正没有任何东西.似乎此无效调用的内部行为已更改.在Perl 5.12.1下运行perl -E "say eof"什么都不打印.在Perl 5.10.0下,它打印"1".

明确测试eof(FILE)应该解决问题.

Tangent:你的代码不是很惯用.一种更有意义的方法

my $content;
while(<$fh>) {
    if ( 1 .. 10 ) { $content .= $_ }
    else           { last }
}
Run Code Online (Sandbox Code Playgroud)

使用的习语是:

  • 使用词法文件句柄而不是typeglob.($fh而不是FILE)
  • 使用范围运算符..可以跟踪读取的行数.此表单隐式地测试输入行号$..
  • 不要显式测试EOF(让循环处理它).
  • 用于last尽早摆脱循环.