2017-09-27 2 views
1

J'appelle perl subroutine avec des chemins comme paramètres du mode CLI unix. Mais Obtenir une erreur trouvée par Bareword. De toute façon pour passer à travers ça.Impossible d'appeler le sous-programme perl avec des chemins en tant que paramètres de bash

[[email protected] ~/test]**$perl -e "require qw(./burt.pm) ;file(/u/path,/u/build/);"** 
Bareword found where operator expected at -e line 1, near "/u/path" 
    (Missing operator before path?) 
Bareword found where operator expected at -e line 1, near "/u/build" 
    (Missing operator before build?) 
syntax error at -e line 1, near "/u/path" 
Execution of -e aborted due to compilation errors. 


    [[email protected] ~/test]$ cat burt.pm 
    #!/usr/software/bin/perl5.8.8 
    use strict; 
    sub file 
    { 
     my ($path1, $path2) = @_; 
     print "path1 $path1\n"; 
     print "path2 $path2\n"; 
    } 
    1; 
+1

Placez des guillemets autour de vos chaînes. – simbabque

+0

Notez que j'ai essayé d'ajouter des guillemets doubles aux chemins. N'a pas pu réussir –

+1

Les guillemets doubles ne sont pas imbriqués. Utilisez des guillemets simples ou q() ou qq(). – choroba

Répondre

4

Vous devez indiquer vos chaînes. Vous ne pouvez pas utiliser les guillemets "" pour cela car vous les utilisez déjà pour le paramètre shell au drapeau -e. Utilisez des guillemets simples '' ou les opérateurs de citation q ou qq à la place.

$ perl -e "require 'burt.pm'; file('/u/path', '/u/build');" 

Il est en général une bonne idée d'utiliser q dans une seule ligne afin de ne pas interférer avec la coquille citant. Dans tous les cas, sur les systèmes Linux, vous voulez probablement utiliser des guillemets simples '' pour le programme Perl qui va après -e, car les guillemets "" activent le mécanisme de citation de votre shell.

En Perl, les guillemets doubles "" tour sur l'interpolation, de sorte que les variables et les caractères spéciaux se remplir j'écrirais votre programme comme celui-ci.

$ perl -e 'require q{burt.pm}; file(q{/u/path}, q{/u/build});' 

Notez également que les programmes Perl sans strict pragma traiteront barewords comme des chaînes, mais une barre oblique / ne fait pas partie du bareword. Perl pense probablement qu'il y a une correspondance de pattern ou une division en cours, et c'est une erreur de syntaxe dans ce cas.

+0

Notez que pour les modules Perl (fichiers '.pm') la convention de dénomination est que la première lettre est en majuscule, le reste est petit. Fondamentalement 'ucfirst' cas de chameau. Tous les noms de minuscules sont réservés aux pragmas tels que 'strict',' warnings', 're' ou' utf8'. – simbabque