Linux上的Perl oneliner中的单引号行为

sid*_*com 3 linux perl command-line sh quote

为什么第二个单行内容尽管有单引号?

perl -wE 'say('Hello')'

# Name "main::Hello" used only once: possible typo at -e line 1.
# say() on unopened filehandle Hello at -e line 1.

perl -wE 'say length('Hello')'

# 5
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 7

在外壳命令,'abc'def,abc'def',abcdef'abcdef'都是相等的,所以'...'Hello'...'是相同的'...Hello...'.


对于perl -wE 'say('Hello')'你的shell调用

exec("perl", "-wE", "say(Hello)")
Run Code Online (Sandbox Code Playgroud)

如果第一个参数say是一个裸字并且没有使用该名称声明子,则将该裸字用作文件句柄.


对于perl -wE 'say length('Hello')'你的shell调用

exec("perl", "-wE", "say length(Hello)")
Run Code Online (Sandbox Code Playgroud)

如果找到了一个裸字,那么该名称没有声明任何子句,则不期望文件句柄,下一个标记不是=>,并且use strict 'subs';不生效,裸字是一个返回自身的字符串文字.


解决方案:

perl -wE 'say("Hello")'           # exec("perl", "-wE", "say(\"Hello\")")

perl -wE 'say(q{Hello})'          # exec("perl", "-wE", "say(q{Hello})")

perl -wE 'say('\''Hello'\'')'     # exec("perl", "-wE", "say('Hello')")
Run Code Online (Sandbox Code Playgroud)

请注意,perl不要求代码是单独的参数.

perl -wE'say("Hello")'            # exec("perl", "-wEsay(\"Hello\")")

perl -wE'say(q{Hello})'           # exec("perl", "-wEsay(q{Hello})")

perl -wE'say('\''Hello'\'')'      # exec("perl", "-wEsay('Hello')")
Run Code Online (Sandbox Code Playgroud)