2013-04-21 5 views
1

Привет, я новичок в stackoverflow. Я пробовал искать способ распечатать другой скрипт perl в другом скрипте perl, и единственным советом, с которым я столкнулся, является экранирование переменных с помощью обратного слэша ... но я пробовал это, и он не работает.Печать скрипта perl в другом скрипте perl?

Моя цель - написать скрипт perl, чтобы создать кучу новых скриптов perl, но поскольку это не позволит мне использовать переменные/массивы/etc в печати "". Есть ли способ обойти это? Заранее спасибо!

Вот мой предварительный сценарий:

#!/usr/bin/perl 
    use warnings; 
    use strict; 

    my $idfile = $ARGV[0]; 
    open (IDFILE,'<',$idfile) 
    or die "Could not open $idfile \n"; 

    my $outfile_name; 
    my $outfile = $outfile_name."pl"; 
    open (OUTFILE, '>', $outfile) 
    or die "Could not open $outfile \n"; 

    while (my $line = <IDFILE>) { 
     chomp ($line); 
     if ($line =~ /(T4-GC_[0-9]+)/) { 
      my $outfile_name = "Pull_".$line; 
      my $script = " 
    #!/usr/bin/perl 
    use warnings; 
    use strict; 
    use Bio::SearchIO; 
    use Bio::SeqIO; 

    my @ARGV = glob("*.fa"); 

    foreach my $fil (@ARGV) { 
     my $seqio = Bio::SeqIO->new(-format => 'fasta', -file => $fil); 
      while (my $seqobj = $seqio->next_seq) { 
      my $seqid = $seqobj->display_id; 
      $fil =~ /([A-Z]+[0-9]+)/; 
      my $phage_name = $1; 
      my $id = $seqid."|".$phage_name; 
      my $nuc = $seqobj->seq(); 
      if ($seqid =~ /**$line**/) { 
        print ">$id\n$nuc\n"; 
      } 
    } 
    }" 
     print OUTFILE $script; 
     } 
    } 

И это ошибка я получаю обратно:

String found where operator expected at make_perl_pull_genes_files.pl line 33, near     "my $id = $seqid."" 
     (Might be a runaway multi-line "" string starting on line 25) 
     (Missing semicolon on previous line?) 
    Backslash found where operator expected at make_perl_pull_genes_files.pl line 36, near "$id\" 
     (Might be a runaway multi-line "" string starting on line 33) 
     (Missing operator before \?) 
    Backslash found where operator expected at make_perl_pull_genes_files.pl line 36, near "$nuc\" 
     (Missing operator before \?) 
    String found where operator expected at make_perl_pull_genes_files.pl line 39, near "}"" 
     (Might be a runaway multi-line "" string starting on line 36) 
     (Missing semicolon on previous line?) 
    syntax error at make_perl_pull_genes_files.pl line 25, near "*." 
     (Might be a runaway multi-line "" string starting on line 18) 
    Global symbol "$id" requires explicit package name at make_perl_pull_genes_files.pl line 36. 
    Global symbol "$nuc" requires explicit package name at make_perl_pull_genes_files.pl line 36. 
    Execution of make_perl_pull_genes_files.pl aborted due to compilation errors. 
+0

Почему вам нужно создавать новые файлы PL? Возможно, было бы лучше создать один PL для вызова его с помощью другой командной строки, если вам нужно. – TrueY

ответ

5

Используйте здесь документ одинарные кавычки вокруг ведущего разделителем.

print <<'EOT'; 
#!/usr/bin/perl 
use warnings; 
use strict; 
use Bio::SearchIO; 
use Bio::SeqIO; 

my @ARGV = glob("*.fa"); 

foreach my $fil (@ARGV) { 
    my $seqio = Bio::SeqIO->new(-format => 'fasta', -file => $fil); 
    while (my $seqobj = $seqio->next_seq) { 
    my $seqid = $seqobj->display_id; 
    $fil =~ /([A-Z]+[0-9]+)/; 
    my $phage_name = $1; 
    my $id = $seqid."|".$phage_name; 
    my $nuc = $seqobj->seq(); 
    if ($seqid =~ /**$line**/) { 
     print ">$id\n$nuc\n"; 
    } 
    } 
} 
EOT 

Обратите внимание, что трейлинг разделитель должен быть обнимались новой строкой: \ nTRAILING \ п в источнике. Не пытайтесь, например, отступать от него. Другое место, где вы можете заполнить такой текст, в вашем исходном файле, находится за пределами линии __DATA__. Затем вы прочтете его через <DATA>.