为什么这个例子不起作用?
#!/usr/bin/perl
use POSIX qw(strftime);
use Time::Local;
my $date = strftime "%Y-%m-%d", localtime;
my $command = "ls clients/*/ERRORi/" . $date . "/*s";
@result = `$command`;
foreach $group (@result) {
my $file = '/opt/' . $group;
open( my $input_fh, '<', $file) || die "Can't open $file: $!";
print $input_fh;
}
它将返回:
Can't open /opt/clients/cli8832/ERRORi/2014-06-25/file.564159972s
: No such file or directory at ./my.pl line 12.
但如果我做ls /opt/clients/cli8832/ERRORi/2014-06-25/file.564159972s
就可以了
答案 0 :(得分:8)
您的$file
变量包含尾随换行符,而实际文件名则不包含。
你应该chomp
出来。
答案 1 :(得分:2)
这是一个很难学习的榜样。
use strict;
和use warnings
。use autodie;
glob
,而不是炮轰ls
。这样就无需chomp
。接下来是该示例的清理版本,尽管最后一行可能也是一个错误。
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
use POSIX qw(strftime);
use Time::Local;
my $date = strftime "%Y-%m-%d", localtime;
for my $group (glob "clients/*/ERRORi/$date/*s") {
my $file = '/opt/' . $group;
open my $input_fh, '<', $file;
print $input_fh;
}