這個帶有一元加號的 perl 片段有什么作用?
join( '/', splice @t, 0, @d )
這是來自 File::Path.pm 第 267 行,我正在嘗試理解它。根據檔案,一元加號什么也不做。splice 的第三個引數也是一個整數,而不是一個陣列。這真的做scalar(@d)嗎?謝謝你的幫助。我正在嘗試用我的Pythonizer將這段代碼翻譯成 python。
我嘗試使用 -MO=Deparse ,它所做的只是吃掉 并移動括號:
join '/', splice(@t, 0, @d);
uj5u.com熱心網友回復:
在 這里完全沒用。
作者可能認為 @d是 的簡短版本scalar(@d),但如果是這樣,他們就錯了。
一元 - 對背景關系 沒有影響。[1]一元 - 完全沒有效果。報價perlop ,
一元
" "沒有任何影響,即使在字串上也是如此。它在語法上用于將函式名稱與帶括號的運算式分開,否則將被解釋為函式引數的完整串列。(請參閱上面“術語和串列運算子(左)”下的示例。)
它可用于消除歧義語法[2]之間的歧義,但在上面的代碼段中它甚至沒有這樣做。這完全是多余的。[3]
也就是說,這里@d 是在標量背景關系中評估的,但這是因為splice運算子在其第三個運算元上施加了標量背景關系。[4]它與一元無關 - 。
因此,另一種可能性是作者想表明這里有一些不尋常的@d地方。人們可能希望它在串列背景關系中進行評估,并且 旨在讓讀者停下來思考。
但是,我不建議這樣做。而不是使用誤導性的 @d,我會使用0 @d來實作這個目標。0 @d實際上強加了標量背景關系,因此它表示@d正在標量背景關系中進行評估,并且這樣做不會產生誤導。
下面演示了 unary-
不影響背景關系:$ perl -Mv5.10 -e' my @a = qw( a b c ); my $x_without = @a; say $x_without; my $x_with = @a; say $x_with; my @y_without = @a; say @y_without; my @y_with = @a; say @y_with; ' 3 3 abc abc請參閱使用 unary-
消除歧義。下面演示了使用和不使用一元 - 時生成的完全相同的代碼
。$ diff -u \ <( perl -MO=Concise,-exec -e'join( '/', splice @t, 0, @d )' 2>&1 ) \ <( perl -MO=Concise,-exec -e'join( '/', splice @t, 0, @d )' 2>&1 ) \ && echo same same下面演示了在標量背景關系中評估第三個運算元:
$ perl -Mv5.10 -e'say prototype( "CORE::splice" ) // "none/special"' \@;$$@
uj5u.com熱心網友回復:
一元 有時有助于告訴決議器如何解釋以下運算式。見perlop:
一元
沒有任何影響,即使在字串上也是如此。它在語法上用于將函式名稱與帶括號的運算式分開,否則將被解釋為函式引數的完整串列。
但是,在這種特殊情況下,它什么也不做,因為@d被決議為splice的第三個引數。也許作者希望它在標量背景關系中進行評估,但不管 .
uj5u.com熱心網友回復:
spliceis的原型\@;$$@,因此可選的第三個引數將在標量背景關系中解釋,有或沒有一元加號。
移植到 Python 的有趣挑戰是處理splice.
的回傳值splice(將傳遞給join函式的內容)是被操作洗掉的元素@t——即. 但是該陣列將被呼叫修改,并且在此陳述句之后它將丟失前幾個元素。scalar @d@t@t
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/464669.html
上一篇:為什么“每個參考的引數型別必須是test.pl第17行的unblessedhashref或arrayref。”?
