bash + PERL 混合脚本

bash + PERL 混合脚本

我是这个社区的新手,我试图寻找相关的答案,但找不到任何答案。

我的问题是,我想在以 .fasta 结尾的文件目录中使用 perl 脚本,如果我在 bash 中这样做

for i in *.fasta
do
perl script.pl
done

问题是:如何在 PERL 脚本中使用 bash 变量 $i 值。perl 脚本打开每个文件,对每个文件执行某些函数并关闭它。例如

my $file1 = 'All-Sequences.fasta'; # I want to replace 'All-Sequences.fasta' with $i
open (FILE, $file);
my @file = <FILE>;
close FILE;
print @file;

这些都是示范性功能。

答案1

您可以使用 @ARGV 数组访问传递给 Perl 脚本的参数,因此您可以执行以下操作:

my $fileName = $ARGV[0];
your code...

并运行它:

for i in *.fasta
do
  perl script.pl "$i"
done

当然,您也可以使用 Perl 函数找到 .fasta 目录,然后循环遍历这些结果。

答案2

mtak 提供的答案最为简单。它可以轻松修改以传递多个文件名,但命令行参数的数量有系统限制。

如果您更喜欢针对性能进行调整的答案巨大的文件数量然后您可以通过管道在 bash(父进程)和 perl(子进程)之间提供文件列表。
它避免多次启动 perl 解释器并达到命令行参数数量的限制。

bash 脚本:

for i in *.fasta ; do
  echo $i
done | perl script.pl

perl 脚本

while (<STDIN>) {
  # get file name
  chomp;     
  my $file = $_;

  # process file named $file
  open (my $FILE,'<', $file) or die "Can't open: $!";
     my @file = <$FILE>;
  close $FILE;
  print @file;
}

相关内容