如何正确运行Perl“单行”命令行脚本?

问题描述:

我已经通过一些教程看,但我仍然无法找出我做错了..我想下面的代码(在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

perl不是一个Perl脚本中一个有效的命令。如果你已经将该文件命名为.sh脚本,并且在shebang行上使用了#!/bin/bash,那么它就可以工作,但编写一个仅用于调用Perl的bash文件并没有多大意义(为什么不调用Perl直接?)

既然你提到你想要与命令行进行交互,我会在这里提到你可以通过@ARGV数组获得Perl内的命令行选项。 (见perldoc perlvar

尝试:

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

当命令执行时,它被转换为执行解释器。

你可能会试图做到这一点:

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

既然你说你要找的相反,这可能是你的意思:

# 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! 
# 

命令行(未在文件中)上

只需键入

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

这只对真的很棒。长一些的脚本需要自己的文件...

假设你有以下输入:

$ 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 

因为你没有给你想要转换的实际一行代码,我不得不放弃一个广泛的,普遍的答案。如果您编辑问题以使其具体针对您想要执行的操作,我们可以提供更有帮助的答案。

这应该工作。双引号内部单引号;)

perl -e "print 'Hello'" 
+0

我很抱歉重振这篇旧文章,但我在哪里可以查看选项的含义? (即你的“-e”)谢谢 – Sosi 2014-10-30 10:49:45

+1

@Sosi“man perl” – 2016-01-15 06:47:38