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

Perl 使用while循环和读取PDB文件时出错$_,perl,Perl,我对Perl不是很熟悉,但我正在尝试让其他人编写的一些旧代码正常工作。代码的目标是在以file.pdb结尾的输入文件上运行名为stride的程序。它应该获取目录中的所有.pdb文件,运行stride并创建输出文件。我知道stride程序是独立运行的,但是当我尝试运行代码时,我得到了以下错误:“错误读取PDB文件_file.PDB”。在其他类似的代码中,我得到了更具体的错误“全局符号”$original_filename“需要显式的包名”。我想我已经把问题缩小到代码对$的使用上了。如果您能帮助我解

我对Perl不是很熟悉,但我正在尝试让其他人编写的一些旧代码正常工作。代码的目标是在以file.pdb结尾的输入文件上运行名为stride的程序。它应该获取目录中的所有.pdb文件,运行stride并创建输出文件。我知道stride程序是独立运行的,但是当我尝试运行代码时,我得到了以下错误:“错误读取PDB文件_file.PDB”。在其他类似的代码中,我得到了更具体的错误“全局符号”$original_filename“需要显式的包名”。我想我已经把问题缩小到代码对$的使用上了。如果您能帮助我解释为什么这段代码不再有效,以及更新后的版本会是什么样子,我将不胜感激。谢谢(注意,use strict和warnings是散列出来的,因为它不是原始代码的一部分)

#/usr/bin/perl
#严格使用;
#使用警告;
while(){
咀嚼;
我的$input=“$”文件.pdb”;
my$output=“$”.stride”;
my$command=“stride”。“$input-f”。“$output”。“-cA”;
系统($指挥);
}
短语
while()
读取命令行中所有文件的每一行

代码似乎与文件名一起工作,文件名位于
@ARGV
中,因此最简单的更改是

foreach (@ARGV) { ... }
现在,循环体中的
$\uu
一次有一个文件名(或者命令行上提供给程序的任何文件名)


请参见

中的“空文件句柄”
,您的任务真的需要perl吗? 请尝试此shell命令:

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


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

如何运行此代码?该代码无法引发错误
全局符号“$original_filename”需要显式包名,因为其中不存在此类变量。最有可能的是,您调用的任何脚本(
stride
?)都会引发该错误。检查
system()
命令是否独立运行。我正在使用perl run\u stride.pl从终端运行它。打印出
$command
以准确查看
系统运行的内容。然后复制粘贴它(从这个程序的输出)到终端并手动运行它。你给它什么输入?可能是
$\uuu
结尾的回车,而不是被
chomp
?@Corion删除。对,这可能是一件事。首先,我猜代码作者误解了
while()
的功能。谢谢您的回复。这似乎更好一些,因为错误已经消失,但是它仍然没有生成名为output_file.pdb的输出文件。@curd我们没有信息来了解这是怎么回事。对于第一步,我建议:添加print语句以查看实际拥有的内容——例如,在
system
之前打印
$command
,然后查看它。如果它看起来很好,那么复制粘贴它,以便在终端中手动运行它。
for name in ./*_file.pdb; do stride "${name}" -f "${name:0:-9}.stride" -cA; done
#!/usr/bin/perl
use strict;
use warnings;


foreach(@ARGV){
    chomp;
        my $input = "$_";
        my $output = "$_".".stride";
        my $command = "stride "."$input -f"."$output"." -cA";
        system($command);
}