使用while循环和$ _读取PDB文件时出错

时间:2018-10-26 17:39:55

标签: perl

我对Perl不太熟悉,但是正在尝试让其他人编写一些旧代码来工作。该代码的目的是在以file.pdb结尾的输入文件上运行一个名为stride的程序。它应获取目录中的所有.pdb文件,运行跨步并创建输出文件。我知道stride程序可以独立运行,但是当我尝试运行代码时出现以下错误:“读取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 :(得分:2)

短语while (<>)从命令行上给出的所有文件中读取每行

该代码似乎可以使用@ARGV中的文件名,因此最简单的更改是

foreach (@ARGV) { ... }

现在循环主体中的$_一次只有一个文件名(或在命令行上提供给程序的任何文件)。

请参阅I/O operators in perlop中的“空文件句柄” <>

答案 1 :(得分:0)

您真的需要perl来完成任务吗? 尝试以下shell命令:

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

答案 2 :(得分:0)

感谢您的帮助!如果我使用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);
}