2010-07-10 3 views
17

J'ai regardé à travers un certain nombre de tutoriels, mais je ne peux toujours pas comprendre ce que je fais mal .. Je suis en train le code ci-dessous (dans un fichier Perl .pl, comme un fichier exécutable):Comment exécuter correctement les scripts de ligne de commande Perl "one liner"?

#!/usr/bin/perl 

perl -e 'print "Hello";' 

J'exécuter ce script et obtenez:

exécution de /home/user1/Desktop/file_backups.pl avorté en raison d'erreurs de compilation.

(je suis nouveau à l'aide de Perl pour appeler la ligne de commande Linux.)

+1

Voulez-vous dire avoir Perl appeler à linux (shell) ligne de commande, ou que le shell appeler Perl? – Ether

Répondre

12

perl n'est pas une commande valide dans un script Perl. Si vous aviez nommé ce fichier comme un script .sh, et utilisé #!/bin/bash sur la ligne shebang, cela aurait fonctionné, mais cela n'a pas vraiment de sens d'écrire un fichier bash juste pour invoquer Perl (pourquoi ne pas invoquer Perl? Puisque vous avez mentionné que vous voulez interagir avec la ligne de commande, je mentionnerai ici que vous pouvez obtenir les options de ligne de commande dans Perl via le tableau @ARGV. (. Voir perldoc perlvar)

14

Essayez:

#!/usr/bin/perl 
# This is a comment ~~~ 
# This script will be run as a Perl script 
# since 'perl' isn't a keyword or function in Perl 
# something like this must fail: 
# 
# perl -e 'print "Hello";' 
# 
# The following should work. 

print "Hello"; print " World\n"; 

Ou, si vous voulez que votre script shell d'exécuter du code Perl:

#!/bin/sh 
# That's a Bash script ~~~ 
# It's just a command line in a file ...  

perl -e 'print "Hello World";' 

Fond: #! est un interpreter directive.

Lorsque la commande est exécutée, elle est convertie en une exécution de l'interpréteur.

0

Vous pouvez essayer de le faire:

system("/usr/bin/perl -e 'print \"Hello!\\\\n\";'"); 
+0

Merci pour les réponses .. bien ce que j'essaie de faire est d'écrire des scripts perl qui interagissent avec la ligne de commande, je suppose que je l'avais à l'envers car ce que je regardais sont des scripts bash/shell pour appeler perl – Rick

+3

mauvais conseil. OP veut imprimer bonjour dans un script Perl. Il suffit donc d'utiliser l'impression. – ghostdog74

+0

@ghostdog: Je n'essaie pas de le conseiller, c'est juste une réponse à une question directe. J'essaie de ne pas juger. on dirait qu'il cherche le contraire, de toute façon, alors on est tous les deux hors. :-) – eruciform

0

Puisque vous avez dit que vous cherchez le contraire, cela peut être ce que vous entendez:

# vi stdin.pl 
# cat stdin.pl 
    #!/usr/bin/perl 
    while(<STDIN>) 
    { 
     if(/^hello/){ print "Hello back to ya!\n"; } 
    } 
# chmod 0777 stdin.pl 
# ./stdin.pl 
    foo 
    hello 
    Hello back to ya! 
# 
9

Tapez juste sur la ligne de commande (pas dans un fichier)

perl -e 'print "Hello World\n";'

Ceci n'est vraiment bon pour les oneliners. Plus les scripts ont besoin de leur propre fichier ...

0

Supposons que vous avez les entrées suivantes:

$ for i in a b c ; do echo "$i is $i" > $i; done 

$ cat a b c 
a is a 
b is b 
c is c

Tout le monde connaît les lettres majuscules sont beaucoup mieux!

perl -i.bak -pe '$_ = uc' a b c

Alors maintenant

$ cat a b c 
A IS A 
B IS B 
C IS C

Mais nous aimerions vraiment peut cela dans une commande appelée upcase, et c'est facile à faire!

#! /usr/bin/perl -pi.bak 
$_ = uc 

voir à l'œuvre:

$ for i in a b c ; do echo "$i is $i" > $i; done 

$ cat a b c 
a is a 
b is b 
c is c 

$ ./upcase a b c 

$ !cat 
cat a b c 
A IS A 
B IS B 
C IS C

Autres conseils d'un answer to a similar question:

L'option -e, prévoit l'code Perl à exécuter, que vous pourriez penser comme un script sur la ligne de commande - alors déposez-le et collez le code dans le corps. Laisser -p dans la ligne shebang (#!).

En général, il est plus sûr de s'en tenir à au plus un "bouquet" d'options dans la ligne shebang. Si vous avez besoin de plus, vous pouvez toujours jeter leurs équivalents dans un bloc BEGIN {}. Ne pas oublier d'activer le bit d'exécution!

chmod +x script-name 

Parce que vous n'avez pas donné le one-liner réel que vous voulez convertir, je devais donner une large réponse générale. Si vous éditez votre question pour la rendre spécifique à ce que vous voulez faire, nous pouvons vous donner des réponses plus utiles.

3

Cela devrait fonctionner. Les guillemets doubles en dehors des guillemets simples à l'intérieur;)

perl -e "print 'Hello'" 
+0

Je suis désolé de faire revivre ce vieux post, mais où puis-je regarder la signification des options? (c'est-à-dire votre "-e") Merci – Sosi

+1

@Sosi "man perl" –

Questions connexes