Не удается найти аргумент, переданный программе, вызванной с помощью системной команды Perl - PullRequest
0 голосов
/ 06 июля 2011

Я пишу Perl-скрипт для запуска внешней программы для каждого файла в каталоге. Эта программа конвертирует файлы из одного формата в другой. Вот сделка ...

Когда я запускаю программу из командной строки, все работает как надо:

computer.name % /path/program /inpath/input.in /outpath/output.out
converting: /inpath/input.in to /outpath/output.out

computer.name %

Вот код, который я написал для преобразования всех файлов в каталоге (указан в "file_list.txt"):

#!/usr/bin/perl -w

use warnings;
use diagnostics;
use FileHandle;
use File::Copy;

# Set simulation parameters and directories
@test_dates = ("20110414");
$listfile = "file_list.txt";
$execname = "/path/program";

foreach $date (@test_dates)
{
    # Set/make directories
    $obs_file_dir = "inpath";
    $pred_file_dir = "outpath";
    mkdir "$pred_file_dir", 0755 unless -d "$pred_file_dir";

    # Read input file names to array
    $obs_file_list = $obs_file_dir . $listfile;
    open(DIR, $obs_file_list) or die "Could not open file!";
    @obs_files = <DIR>;
    close(DIR);

    # Convert and save files
    foreach $file (@obs_files)
    {    
        $file =~ s/(\*)//g;
        $infile = $obs_file_dir . $file;
        $outfile = $pred_file_dir . $file;
        $outfile =~ s/in/out/g;
        print $infile . "\n";
        @arg_list = ($execname, $infile, $outfile);
        system(@arg_list);
    }
}

В выводе отображается следующая ошибка для каждого файла в списке:

computer.name % perl_script_name.pl
/inpath/input.in
converting: /inpath/input.in to /outpath/output.out

unable to find /inpath/input.in
stat status=-1
error while processing the product

Я проверил, что каждый файл находится в правильном месте, и понятия не имею, почему я получаю эту ошибку. Почему файлы не могут быть найдены? Когда я вручную передаю аргументы с помощью командной строки, никаких проблем. Когда я передаю аргументы через переменную через вызов system, их невозможно найти, даже если путь и имена файлов указаны правильно.

Ваш совет с благодарностью!

1 Ответ

1 голос
/ 29 февраля 2012

Ваш список файлов (@obs_files) получен при чтении в файле через @obs_files = <DIR>;

Когда вы сделаете это, каждый элемент массива будет строкой из файла (например, список каталогов),строка завершается символом новой строки .

Перед ее использованием необходимо удалить символ новой строки с помощью chomp($file).

Обратите внимание, что s/(\*)//g;НЕ удаляет завершающий символ новой строки!

...