2010-07-10 11 views
17

Szukałem poprzez szereg ćwiczeń, ale nadal nie mogę dowiedzieć się, co robię źle .. Próbuję poniższy kod (w .pl pliku Perl, jako plik wykonywalny):Jak poprawnie uruchomić skrypty wiersza poleceń Perla "one liner"?

#!/usr/bin/perl 

perl -e 'print "Hello";' 

uruchomić ten skrypt, a otrzymasz:

Wykonanie /home/user1/Desktop/file_backups.pl przerwana z powodu błędów kompilacji.

(jestem nowy w użyciu Perl zadzwonić z wiersza poleceń Linuksa.)

+1

Czy to znaczy mieć Perl wołać do (Shell) linii poleceń Linuksa, lub powłoka nazwać Perl? – Ether

Odpowiedz

12

perl nie jest poprawnym poleceniem wewnątrz skryptu Perl. Gdybyś nazwał ten plik jako skrypt .sh i użył #!/bin/bash na linii shebang, to by zadziałało, ale nie ma sensu pisać pliku basha tylko po to, aby wywołać Perla (dlaczego nie wywołać Perla bezpośrednio?)

Ponieważ wspomniałeś, że chcesz wejść w interakcję z wierszem poleceń, wspomnę tutaj, że możesz uzyskać dostęp do opcji linii poleceń w Perlu poprzez tablicę @ARGV. (. Zobacz perldoc perlvar)

14

Spróbuj:

#!/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"; 

Albo, jeśli chcesz, aby skrypt do wykonania kodu Perl:

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

perl -e 'print "Hello World";' 

Tło: #! to interpreter directive.

Po wykonaniu polecenia zostaje przekształcone w wykonanie interpretera.

0

Można próbować to zrobić:

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

Dzięki za odpowiedzi ... cóż, próbuję to zrobić, pisząc skrypty perl, które wchodzą w interakcję z wierszem poleceń, myślę, że miałem to od tyłu, ponieważ to, na co patrzyłem, to skrypty bash/shell, które można wywołać perl – Rick

+3

To jest po prostu zła rada. OP chce wydrukować powitanie wewnątrz skryptu Perla. Więc po prostu użyj print. – ghostdog74

+0

@ghostdog: Nie próbuję tego doradzać, to tylko odpowiedź na bezpośrednie pytanie. Próbuję nie osądzać. wygląda na to, że i tak szuka czegoś przeciwnego, więc obaj jesteśmy wyłączeni. :-) – eruciform

0

Skoro powiedział szukasz przeciwnie, to może być to, co masz na myśli:

# 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

typ Wystarczy w wierszu poleceń (nie w pliku)

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

Jest to bardzo dobre rozwiązanie tylko w przypadku nadajników. Dłuższe skrypty potrzebują własnego pliku ...

0

Powiedzmy, że masz następujące wejścia:

$ 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

Każdy wie, litery są znacznie lepiej!

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

Więc teraz

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

Ale naprawdę chciałbym to może w poleceniu nazywa upcase, a to jest łatwe do zrobienia!

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

Zobacz go w pracy:

$ 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

Więcej porad z answer to a similar question:

Opcja -e wprowadza kod Perl do wykonania-które można myśleć jako skrypt na z linii poleceń - upuść go i przyklej kod do ciała. Pozostaw -p w wierszu shebang (#!).

Zasadniczo najbezpieczniej jest trzymać się co najwyżej jednej "grupy" opcji w linii półbusza. Jeśli potrzebujesz więcej, zawsze możesz wyrzucić ich odpowiedniki w bloku BEGIN {}.

Nie zapomnij włączyć bitu wykonania!

chmod +x script-name 

Ponieważ nie dają rzeczywistą jedno-liner, który chcesz przekonwertować, musiałem dać szerokie i ogólne odpowiedzi. Jeśli edytujesz pytanie, by było ono dostosowane do tego, co chcesz zrobić, możemy udzielić bardziej przydatnych odpowiedzi.

3

To powinno zadziałać. Cudzysłowy poza apostrofami wewnątrz;)

perl -e "print 'Hello'" 
+0

Przykro mi, że mogę ożywić ten stary post, ale gdzie mogę spojrzeć na znaczenie opcji? (np. twoje "-e") Dzięki – Sosi

+1

@Sosi "man perl" –

Powiązane problemy