Perl открыть файл с переменной в имени

#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;
}