2010-07-10 127 views
17

我已經通過一些教程看,但我仍然無法找出我做錯了..我想下面的代碼(在Perl的特等文件,作爲一個可執行文件):如何正確運行Perl「單行」命令行腳本?

#!/usr/bin/perl 

perl -e 'print "Hello";' 

我運行此腳本,並得到:

/home/user1/Desktop/file_backups.pl的執行中止由於編譯錯誤。

(我是新來使用Perl調用Linux命令行。)

+1

你的意思是讓Perl調用linux(shell)命令行,或者讓shell調用Perl? – Ether 2010-07-10 18:06:07

回答

12

perl不是一個Perl腳本中一個有效的命令。如果你已經將該文件命名爲.sh腳本,並且在shebang行上使用了#!/bin/bash,那麼它就可以工作,但編寫一個僅用於調用Perl的bash文件並沒有多大意義(爲什麼不調用Perl直接?)

既然你提到你想要與命令行進行交互,我會在這裏提到你可以通過@ARGV數組獲得Perl內的命令行選項。 (見perldoc perlvar

14

嘗試:

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

或者,如果你希望你的shell腳本來執行Perl代碼:

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

perl -e 'print "Hello World";' 

背景:#!interpreter directive

當命令執行時,它被轉換爲執行解釋器。

0

你可能會試圖做到這一點:

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

感謝您的回覆..以及我想要做的是編寫perl腳本,與命令行進行交互,我想我已經倒過來了,因爲我正在看的是bash/shell腳本來調用perl – Rick 2010-07-10 17:47:47

+3

這只是不好的建議。 OP想要在Perl腳本中打印hello。所以只需使用打印。 – ghostdog74 2010-07-10 17:49:00

+0

@ghostdog:我沒有試圖提出這個建議,它只是一個直接問題的答案。我試圖不去判斷。看起來他正在尋找相反的東西,無論如何,所以我們都沒有了。 :-) – eruciform 2010-07-10 17:55:14

0

既然你說你要找的相反,這可能是你的意思:

# 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
命令行(未在文件中)上

只需鍵入

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

這隻對真的很棒。長一些的腳本需要自己的文件...

0

假設你有以下輸入:

$ 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

大家都知道大寫字母是更好!

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

所以現在

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

但我們真的很想能在這個命令叫upcase,這是很容易做到!

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

在看到它的工作:

$ 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

answer to a similar question更多提示:

-e選項引入了被執行,其中Perl代碼你可能會想,作爲一個腳本命令行 - 所以放下它並將代碼粘貼到主體中。留在012b在shebang(#!)行。

一般來說,最安全的做法是堅持最多一個「叢」選項。如果你需要更多的東西,你可以在BEGIN {}塊中扔掉它們的等價物。

不要忘記打開執行位!

chmod +x script-name 

因爲你沒有給你想要轉換的實際一行代碼,我不得不放棄一個廣泛的,普遍的答案。如果您編輯問題以使其具體針對您想要執行的操作,我們可以提供更有幫助的答案。

3

這應該工作。雙引號內部單引號;)

perl -e "print 'Hello'" 
+0

我很抱歉重振這篇舊文章,但我在哪裏可以查看選項的含義? (即你的「-e」)謝謝 – Sosi 2014-10-30 10:49:45

+1

@Sosi「man perl」 – 2016-01-15 06:47:38