【问题标题】:Why does my Perl open() fail with "Unsuccessful open on filename containing newline"?为什么我的 Perl open() 失败并显示“在包含换行符的文件名上打开失败”?
【发布时间】:2011-01-09 00:27:55
【问题描述】:

我试图将${date[0]} 放在我的目录中,这相当于01252010,但@hits 没有打印出来。我怎样才能设法打开目录以获得所需的输出?谢谢。

错误: 在 ./total.pl 第 11 行第 1 行对包含换行符的文件名打开失败。

#!/opt/perl/bin/perl -w

use strict;

open(FH,"/home/daily/scripts/sms_hourly_stats/date.txt");
my @date = <FH>;
print $date[0];

my $path = "/home/daily/output/sms_hourly_stats/${date[0]}/TOTAL.txt";
open(FILE,"$path") or die "Unable to open $path: $!";
my @hits = <FILE>;
print @hits;

close FH;
close FILE;

【问题讨论】:

  • 听取您的错误信息。它说您有一个文件名,其中包含换行符,因此请查看 $path 并向后工作,直到找到换行符出现的位置。 :)
  • 聪明的头脑在这个网站上相遇:-) 希望在编程方面也做得更好!谢谢!

标签: perl directory


【解决方案1】:

您需要删除行结束符。使用chomp

chomp(my @date = <FH>);

【讨论】:

  • 或者你也可以写 chomp(@date = )
  • 仍然无法打开 /home/sudo724/reports/daily/output/sms_hourly_stats/1/TOTAL.txt ${date[0]} 的值为 1?谢谢。
  • 我想我已经用 chomp(my @date=) 搞定了。非常感谢!:-)
  • 我不认为你想要 chomp 的返回值。 map {chomp; $_}
  • @Anonymous:谢谢!我已经修好了
【解决方案2】:
  1. 按照 Ivan 的建议,对得到的值使用 chomp
  2. 您在哪里找到语法 ${date[0]} ?使用 $date[0]。

【讨论】:

  • 正如我在许多脚本中遇到的那样,${date[0]} 和 $date[0] 之间存在差异,尤其是在处理或连接数字方面?比如 $num[0] = 3 home/dir/2009${num[0]}0 表示 30 home/dir/2009$num[0]0 这是错误的?
  • ${date[0]} 在插值上下文中“更安全”,但在这里并不是必需的。如果您有一个复杂的表达式要在插值字符串中展开,它会更有用。
【解决方案3】:
#!/opt/perl/bin/perl -w

use strict;

open(FH,"/home/daily/scripts/sms_hourly_stats/date.txt");
my @date = <FH>;
my $dir;
print ${date[0]};
chomp($dir = ${date[0]});


my $path = "/home/daily/output/sms_hourly_stats/$dir/TOTAL.txt";
open(FILE,"$path") or die "Unable to open $path: $!";
my @hits = <FILE>;
print @hits;

close FH;
close FILE;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 2020-07-12
    相关资源
    最近更新 更多