【问题标题】:Difference in behaviour between Perl versionsPerl 版本之间的行为差​​异
【发布时间】:2014-01-21 13:43:46
【问题描述】:

我有以下脚本

#!/usr/bin/perl -w
print "sample\n";
syswrite STDIN, "script";
my $input = <STDIN>;
print "$input";

此脚本在 Perl 5.8.8 版本中正确执行,输出如下:

sample
script

但是在 Perl 5.14.2 中执行时会出现以下错误:

文件句柄 STDIN 仅在 ./sample.pl 第 5 行为输入打开。

Perl 版本之间发生了哪些变化?

【问题讨论】:

  • 5.8.8 允许写入标准输入是“正确”执行的想法,让我觉得很有趣。在任何情况下,perldoc perldelta 都会为您提供当前版本与之前版本之间的更改列表。
  • 我确实检查了 perldoc perldelta。但它没有提到任何关于 STDIN 或写入 STDIN 的内容。还有其他指针吗?
  • 你应该知道每个 perldelta 只代表一个版本和前一个版本之间的变化。有关完整的故事,您需要阅读 perl589deltaperl5100delta、perl5101delta` .... 放松一下。

标签: perl


【解决方案1】:

大概,您要求复制 5.8.8 的行为。我不确定这样做有多大意义,但您可以创建一个附加到相同文件描述符的 Perl 读写句柄,如下所示:

$ perl -e'
   open(my $fh, "+>&=", 0) or die $!;
   print($fh "foo\n") or die $!;
' >/dev/null
foo

$ perl -e'
   {
      open(my $fh, "+>&=", 0) or die $!;
      close(STDIN);
      open(STDIN, "+>&=", $fh) or die $!;
   }
   print(STDIN "foo\n") or die $!;
' >/dev/null
foo

【讨论】:

  • 请给我运行第一个 sn-p 的确切输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 2012-12-07
  • 2011-06-24
  • 1970-01-01
  • 2015-08-08
  • 2012-11-20
  • 1970-01-01
相关资源
最近更新 更多