bash + skrip hybrid PERL

1

Saya baru mengenal komunitas ini, saya mencoba menemukan jawaban yang relevan tetapi tidak dapat menemukan jawaban.

Pertanyaan saya adalah, saya ingin menggunakan skrip perl dalam direktori file yang diakhiri dengan .fasta, jika saya melakukannya di bash as

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

Pertanyaannya adalah: Bagaimana saya bisa menggunakan nilai bash variabel $ i dalam skrip PERL. Script perl membuka setiap file, melakukan fungsi tertentu pada setiap file dan menutupnya. seperti

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

Ini adalah fungsi yang patut dicontoh.

Hammad Mubeen
sumber

Jawaban:

2

Anda dapat mengakses parameter yang diberikan ke skrip Perl dengan array @ARGV, sehingga Anda bisa melakukan ini:

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

Dan jalankan dengan:

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

Anda juga bisa menemukan direktori .fasta dengan fungsi Perl tentu saja dan kemudian mengulang hasilnya.

mtak
sumber
Saya mengerti, @ARGV memiliki kemampuan untuk mendapatkan nilai-nilai eksternal yang merupakan fungsionalitas PERL yang luar biasa. Terima kasih banyak :)
Hammad Mubeen
0

Jawaban yang diberikan oleh mtak adalah yang paling sederhana. Itu dapat dengan mudah dimodifikasi untuk melewati lebih dari satu nama file tetapi ada suatu sistem tergantung batas jumlah argumen baris perintah.

Jika Anda lebih suka jawaban yang disetel untuk kinerja untuk sejumlah besar file maka Anda dapat memberi makan daftar file melalui pipa antara bash (proses induk) dan perl (proses anak).
Ini menghindari memulai penerjemah perl berkali-kali dan mencapai batas jumlah argumen baris perintah.

skrip bash:

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

skrip 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
sumber