Ошибка чтения файла PDB при использовании цикла while и $ _ - PullRequest
0 голосов
/ 26 октября 2018

Я не очень знаком с Perl, но пытаюсь заставить работать какой-то старый код, написанный кем-то другим.Задача кода - запустить программу под названием stride для входных файлов, которые заканчиваются на file.pdb.Он должен захватить все файлы .pdb в каталоге, запустить шаг и создать выходные файлы.Я знаю, что программа бега работает автономно, но я получаю следующую ошибку при попытке запустить код: «Ошибка чтения файла PDB _file.pdb».В другом подобном коде я получаю более конкретную ошибку «Глобальный символ« $ original_filename »требует явного имени пакета».Я думаю, что сузил проблему до использования кода $ _.Я был бы признателен за любую помощь, почему этот код больше не работает и как будет выглядеть обновленная версия.Благодарю.(Обратите внимание, что использование строгих правил и предупреждений хэшируется, поскольку оно не было частью исходного кода).

#!/usr/bin/perl
#use strict;
#use warnings;


while(<>){
    chomp;
        my $input = "$_"."_file.pdb";
        my $output = "$_".".stride";
        my $command = "stride "."$input -f"."$output"." -cA";
        system($command);
}

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Вам действительно нужен Perl для вашей задачи?Попробуйте эту команду оболочки:

for name in file1 file2 file3; do stride ${name}_file.pdb -f ${name}.stride -cA; done

Или

for name in ./*_file.pdb; do stride "${name}" -f "${name:0:-9}.stride" -cA; done
0 голосов
/ 26 октября 2018

Спасибо за вашу помощь!Теперь это работает, если я запускаю его из командной строки с помощью perl run_stride.pl * _file.pdb:

#!/usr/bin/perl
use strict;
use warnings;


foreach(@ARGV){
    chomp;
        my $input = "$_";
        my $output = "$_".".stride";
        my $command = "stride "."$input -f"."$output"." -cA";
        system($command);
}
0 голосов
/ 26 октября 2018

Фраза while (<>) читает каждую строку из всех файлов, указанных в командной строке.

Код, по-видимому, работает с именами файлов, которые находятся в @ARGV, поэтомусамое простое изменение -

foreach (@ARGV) { ... }

, и теперь $_ в теле цикла имеет одно имя файла за раз (или все, что указано в программе в командной строке).

См. о"null filehandle" <> в операторах ввода-вывода в perlop

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...