#perl
#perl
Вопрос:
Почему этот пример не работает?
#!/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
, это сработает
Комментарии:
1. Форматирование сообщения об ошибке является хорошей подсказкой здесь. В
$file
нем есть новая строка.
Ответ №1:
Ваша $file
переменная содержит символ перевода строки в конце, тогда как ваше фактическое имя файла этого не делает.
Вы должны chomp
это сделать.
Ответ №2:
Это плохой пример для изучения.
- Включить
use strict;
иuse warnings
в КАЖДЫЙ сценарий perl. - Включайте
use autodie;
в любое время, когда вы выполняете обработку файла - И, наконец, вместо того, чтобы выкладывать
ls
, просто используйте файлglob
. Это устранит необходимость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;
}