2013-12-14 50 views
3

爲什麼第二個單行工作儘管有單引號?Linux上的Perl oneliner中的單引號行爲

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 

回答

7

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


對於perl -wE 'say('Hello')',你的shell調用

exec("perl", "-wE", "say(Hello)") 

如果say第一個參數是一個裸字,並沒有子已被宣佈與該名稱,裸字作爲一個文件句柄。


對於perl -wE 'say length('Hello')',你的shell調用

exec("perl", "-wE", "say length(Hello)") 

如果發現裸詞,沒有子已經被這個名字聲明,預計不會文件句柄,下一個記號不是=>,和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')") 

注意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')")