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

时间:2010-07-13 07:54:35

标签: perl

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

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


编辑:

我认为“我在哪里可以找到5.10和5.12之间的差异列表”问题的最佳答案是“{3}}”在“已接受的答案”下的评论。有关以下代码的说明,请阅读plusplus


适用于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>;
}

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

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

2 个答案:

答案 0 :(得分: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 }
}

使用的习语是:

  • 使用词法文件句柄而不是typeglob。 ($fh代替FILE
  • 使用范围运算符..跟踪读取的行数。这个表格 隐式测试输入行号$.
  • 不要明确测试EOF(让循环处理它)。
  • 使用last提前退出循环。

答案 1 :(得分:4)

查看perldoc页面。你会发现perldelta在那里。或者发布您的代码并让我们看一下;)