Perl 6 中的引號結(jié)構(gòu)

The Q Lang


在 Perl 6 中, 字符串通常使用一些引號結(jié)構(gòu)來表示. 這些引號結(jié)構(gòu)中,最簡單的就是 Q, 通過便捷方式 ?…?Q 后跟著由任意一對兒分隔符包圍著的文本. 大多數(shù)時候, 你需要的只是 '…'"…".

Literal strings: Q


Q[A literal string]
?More plainly.?
Q ^Almost any non-word character can be a delimiter!^

分隔符能夠嵌套, 但是在普通的 Q 形式中, 反斜線轉(zhuǎn)義是不允許的. 換種說法就是, Q 字符串盡可能被作為字面量.

Q<Make sure you <match> opening and closing delimiters>
Q{This is still a closing brace → \}

這些例子產(chǎn)生:

A literal string
More plainly.
Almost any non-word character can be a delimiter!
Make sure you <match> opening and closing delimiters
This is still a closing brace → \

Escaping: q


'Very plain'
q[This back\slash stays]
q[This back\\slash stays] # Identical output
q{This is not a closing brace → \}, but this is → }
Q :q $There are no backslashes here, only lots of \$\$\$!$
'(Just kidding. There\'s no money in that string)'
'No $interpolation {here}!'
Q:q#Just a literal "\n" here#

q 形式的引號結(jié)構(gòu)允許使用反斜線轉(zhuǎn)義可能會結(jié)束字符串的字符. 反斜線自身也能被轉(zhuǎn)義, 就像上面的第三個例子那樣. 通常的形式是 '...'q 后跟著分隔符, 但是它也能作為 Q 上的副詞使用, 就像上面的第五個和最后一個例子那樣.

這些例子產(chǎn)生:

Very plain
This back\slash stays
This back\slash stays
This is not a closing brace → } but this is →
There are no backslashes here, only lots of $$$!
(Just kidding. There's no money in that string)
No $interpolation {here}!
Just a literal "\n" here

Interpolation: qq


my $color = 'blue';
say "My favorite color is $color!" # My favorite color is blue!

qq 形式 -- 通常使用雙引號寫成 -- 允許變量的插值, 例如字符串中能寫入變量, 以使變量的內(nèi)容能插入到字符串中. 在 qq 引起字符串中, 也能轉(zhuǎn)義變量.

say "The \$color variable contains the value '$color'";
# The $color variable contatins the value 'blue'

qq 的另外一種功能是使用花括號在字符串中插值 Perl 6 代碼:

my ($x, $y, $z) = 4, 3.5, 3;
say "This room is $x m by $y m by $z m."
say "Therefore its volume should be { $x * $y * $z } m3!"

輸出:

This room is 4 m by 3.5 m by 3 m.
Therefore its volume should be 42 m3!

默認(rèn)情況下, 只有帶有 '$' 符號的變量才能正常插值. 這時, "documentation@perl6.org" 不會插值 @perl6 變量. 如果呢確實想那么做, 在變量名后面添加一個 []:

my @neighbors = "Felix", "Danielle", "Lucinda";
say "@neighbors[] and I try our best to coexist peacefully."

輸出:

Felix Danielle Lucinda and I try our best to coexist peacefully.

通常使用一個方法調(diào)用會更合適. 只有在 qq 引號中, 方法調(diào)用后面有圓括號, 就能進(jìn)行插值:

say "@neighbors.join(', ') and I try our best to coexist peacefully."

輸出:

Felix, Danielle, Lucinda and I try our best to coexist peacefully.

"@example.com" 產(chǎn)生 @example.com.

Word quoting: qw


<a b c> eqv ('a', 'b', 'c')
qw|! @ # $ % ^ & * \| < > | eqv '! @ # $ % ^ & | < >'.words
Q:w { [ ] \{ \} } eqv ('[', ']', '{', '}')

:w 通常寫作 <...>qw, 把字符串分割為"words" (單詞). 在這種情景下, 單詞被定義為由空格分割的一串非空白字符. q:wqw 繼承了 q 的插值和轉(zhuǎn)義語法, 還有單引號字符串分割符, 而 QwQ:w 繼承了 Q 的非轉(zhuǎn)義語法.

my @directions = 'left', 'right,', 'up', 'down';

這樣讀和寫都更容易:

my @directions = <left right up down>;

Word quoting with interpolation: qqw


qw 形式的 word quoting 不會進(jìn)行變量插值:

my $a = 42; say qw{$a b c};  # $a b c

因此, 如果你想在引號字符串中進(jìn)行變量插值, 你需要使用 qqw 變體:

my $a = 42;
my @list = qqw{$a b c};
say @list;                # 42 b c

或者同樣的:

my $a = 42;
my @list = ?$a b c?;
say @list;                # 42 b c

Shell quoting: qx


把一個字符串作為一個外部程序運(yùn)行, 在 Perl 6 中反引號不再用于 shell quoting, 并且 qx 不再插值 Perl 變量, 因此:

my $world = "there";
say qx{echo "hello $world"}

僅僅打印 hello. 然而, 如果你在調(diào)用 perl6 之前聲明了一個環(huán)境變量, 這在 qx 里是可用的, 例如:

WORLD="there" perl6
> say qx{echo "hello $WORLD"}

現(xiàn)在會打印 hello there.

調(diào)用 qx 會返回結(jié)果, 所以這個結(jié)果能被賦值給一個變量以便后來使用:

my $output = qx{echo "hello!"};
say $output;    # hello!

Shell quoting with interpolation: qqx


帶插值的 Shell quoting:

my $world = "there";
say qqx{echo "hello $world"};  # hello there

再一次, 外部命令的輸出結(jié)果可以保存在一個變量中:

my $word = "cool";
my $option = "-i";
my $file = "/usr/share/dict/words";
my $output = qqx{grep $option $word $file};
# runs the command: grep -i cool /usr/share/dict/words
say $output;      # Cooley
Cooley's
Coolidge
Coolidge's
cool
 ...

Heredocs: :to


heredocs 是多行字符串字面量的便捷方式, 你能選擇自己的分隔符:

say q:to/END/;
Here is
some multi-line
string
END

heredoc 的內(nèi)容從下一行開始.

my $escaped = my-escaping-function(q:to/TERMINATOR/, language => 'html');
Here are the contents of the heredoc.
Potentially multiple lines.
TERMINATOR

如果終止分隔符縮進(jìn)了, 同等數(shù)量的縮進(jìn)會從字符串字面量上移除. 因此下面這個 heredoc

say q:to/END/;
    Here is
    some multi line
        string
    END

輸出:

Here is
some multi line
    string
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子枢冤,更是在濱河造成了極大的恐慌评架,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丐巫,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)陷虎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杠袱,“玉大人泻红,你說我怎么就攤上這事∠疾簦” “怎么了谊路?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長菩彬。 經(jīng)常有香客問我缠劝,道長,這世上最難降的妖魔是什么骗灶? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任惨恭,我火速辦了婚禮,結(jié)果婚禮上耙旦,老公的妹妹穿的比我還像新娘脱羡。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布锉罐。 她就那樣靜靜地躺著帆竹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脓规。 梳的紋絲不亂的頭發(fā)上栽连,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機(jī)與錄音侨舆,去河邊找鬼秒紧。 笑死,一個胖子當(dāng)著我的面吹牛挨下,可吹牛的內(nèi)容都是我干的熔恢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼臭笆,長吁一口氣:“原來是場噩夢啊……” “哼绩聘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起耗啦,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤凿菩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后帜讲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衅谷,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年似将,在試婚紗的時候發(fā)現(xiàn)自己被綠了获黔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡在验,死狀恐怖玷氏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腋舌,我是刑警寧澤盏触,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站块饺,受9級特大地震影響赞辩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜授艰,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一辨嗽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧淮腾,春花似錦糟需、人聲如沸屉佳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽武花。三九已至,卻和暖如春诅诱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背送朱。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工娘荡, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人驶沼。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓炮沐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親回怜。 傳聞我的和親對象是個殘疾皇子大年,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容