我对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);
}
答案 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);
}