script híbrido bash + PERL

1

Sou novo nesta comunidade, tentei encontrar respostas relevantes, mas não consegui encontrar nenhuma.

Minha pergunta é: eu quero usar o script perl em um diretório de arquivos que terminem com .fasta, se eu fizer no bash como

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

A pergunta é: como posso usar o valor da variável $ i do bash no script PERL. O script perl abre cada arquivo, executa determinadas funções em cada arquivo e fecha-o. gostar

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

Essas são funções exemplares.

Hammad Mubeen
fonte

Respostas:

2

Você pode acessar os parâmetros fornecidos ao script Perl com a matriz @ARGV, para fazer o seguinte:

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

E execute-o com:

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

Você também pode encontrar os diretórios .fasta com uma função Perl, é claro, e depois fazer um loop sobre esses resultados.

mtak
fonte
Entendi, o @ARGV tem capacidade de obter valores externos, o que é uma ótima funcionalidade do PERL. Muito obrigado :)
Hammad Mubeen
0

A resposta fornecida pelo mtak é mais simples. Ele pode ser facilmente modificado para passar mais de um nome de arquivo, mas existe um limite dependente do sistema do número de argumentos da linha de comando.

Se você preferir a resposta ajustada para desempenho para um grande número de arquivos , poderá alimentar a lista de arquivos via canal entre bash (processo pai) e perl (processo filho).
Evita iniciar o interpretador perl muitas vezes e atingir limites no número de argumentos da linha de comando.

script bash:

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

script 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;
}
AnFi
fonte