2017-09-26 2 views
2

J'ai un fichier appelé list.txt qui ressemble à ceci: (il a plus de 500 lignes)Perl: comment désigner les lignes commençant par «/»

/apps/gtool/0.7.5/gtool -M --g gen1.txt etc 
/apps/gtool/0.7.5/gtool -M --g gen2.txt etc 
/apps/gtool/0.7.5/gtool -M --g gen3.txt etc 

Je veux faire de script .sh avec chaque ligne de list.txt. Je peux le faire en Perl, mais j'ai un problème que je ne sais pas comment désigné une ligne commençant par /

Mon script est la suivante:

use strict; 
use warnings; 

open (IN, "<list_for_merging_chunks.sh"); 
while (<IN>) 
{ 
    if ($_=~ m/^/apps.*\n/) 
    { 
    my $file = $_; 
    $file =~ s/.*\> //; 
    $file =~ s/\.txt/.sh/; 
    $file =~ s/\n//; 
    open (OUT, ">$file"); 
    print OUT "\#!/bin/bash\n\#BSUB -J \"$file\"\n\#BSUB -o 
/scratch/home/\n\#BSUB -e /scratch/home/$file\.out\n#BSUB -n 1\n\#BSUB -q 
normal\n\#BSUB -P DBCDOBZAK\n\#BSUB -W 168:00\n"; 
    print OUT $_; 
    close OUT; 
    } 

} 

exit; 

Je reçois une erreur:

Bareword found where operator expected at merging_chunks.pl line 7, near "*\n" 
    (Missing operator before n?) 
"my" variable $file masks earlier declaration in same statement at 
merging_chunks.pl line 10. 
"my" variable $file masks earlier declaration in same scope at 
merging_chunks.pl line 11. 
"my" variable $file masks earlier declaration in same scope at 
merging_chunks.pl line 12. 
"my" variable $file masks earlier declaration in same scope at 
merging_chunks.pl line 14. 
"my" variable $file masks earlier declaration in same scope at 
merging_chunks.pl line 15. 
"my" variable $file masks earlier declaration in same statement at 
merging_chunks.pl line 15. 
"my" variable $file masks earlier declaration in same statement at 
merging_chunks.pl line 15. 
"my" variable $_ masks earlier declaration in same scope at merging_chunks.pl 
line 16. 
syntax error at merging_chunks.pl line 7, near "*\n" 
syntax error at merging_chunks.pl line 20, near "}" 
Execution of merging_chunks.pl aborted due to compilation errors. 

Je pense que cela est de faire avec ce fichier: if ($_=~ m/^/apps.*\n/) il ne semble pas que le fait qu'elle commence par un /. Y at-il de toute façon que je puisse contourner cela? Je suppose qu'il y a un personnage spécial que je pourrais utiliser pour dire à Perl? Merci beaucoup.

Répondre

2

Vous pouvez échapper les caractères meta dans les expressions régulières avec un blackslash.

m/^\/apps.*\n/ 

Vous pouvez également modifier le délimiteur de votre correspondance de motif comme celui-ci.

m{^/apps.*\n} 

Vous ne semblez savoir que, comme vous l'avez déjà fait dans son double chaîne entre guillemets plus loin dans votre code. Notez que vous n'avez pas besoin de la pièce $_ =~ si vous travaillez sur $_. Si vous utilisez m//, il est implicite d'être sur $_.

1

Changer le delimiter regexpr par un caractère non utilisé à l'intérieur du regexpr. Dans cet exemple, j'utilise le ! au lieu de /:

$_=~ m!^/apps.*\n! 

ou SCAPE le caractère /:

$_ =~ m/^\/apps.*\n/