我正在通過O'Reilly編程Perl第3版閱讀,文中指出,不應使用歧義搜索模式/$foo[bar]/
,而應使用/${foo[bar]}/
,以便Perl不會將[bar]
誤認爲字符類。我是否錯過了某些東西,或者這兩個語句在語法上都是不正確的,因爲它們試圖使用空字符串來索引數組?我在網上查了這本書的勘誤表,在書中找不到任何提及這是一個錯誤。是否有一些我可以忽略的代碼可能是有效的?
回答
我通過O'Reilly的編程閱讀的Perl,3 次版和文本規定,而是採用了模棱兩可的搜索模式
/$foo[bar]/
,應改用/${foo[bar]}/
,這樣的Perl沒有按不要錯過[bar]
爲一個角色類。我是否錯過了某些東西,或者這兩個語句在語法上都是不正確的,因爲它們試圖使用空字符串來索引數組?
是的,你失去了一些東西:bar
可以是一個函數調用:
$ perl -Mstrict -E 'sub bar() { 0 } say "foo" =~ /$ARGV[bar]/ || "FAIL"' foo
FAIL
$ perl -Mstrict -E 'sub bar() { 0 } say "foo" =~ /${ARGV[bar]}/ || "FAIL"' foo
1
$ perl -MO=Deparse -Mstrict -E 'sub bar() { 0 } say "foo" =~ /${ARGV[bar]}/ || "FAIL"' foo
sub bar() { 0 }
use strict 'refs';
BEGIN {
$^H{'feature_unicode'} = q(1);
$^H{'feature_say'} = q(1);
$^H{'feature_state'} = q(1);
$^H{'feature_switch'} = q(1);
}
say 'foo' =~ /$ARGV[0]/ || 'FAIL';
-e syntax OK
確切的報價,從Programming Perl, 4th edition 73頁,是:
在搜索模式,其中 是一個不幸的歧義:
/$foo[bar]/
被解釋爲/${foo}[bar]/
(其中[bar]
是正則表達式的字符類)或/${foo[bar]}/
(其中[bar]
是數組@foo
的下標)?如果@foo
不存在,它顯然是 一個字符類。如果存在@foo
,Perl會很好地猜出[bar]
和 幾乎總是正確的。如果它猜錯了,或者你只是普通的偏執狂, 你可以用大括號強制正確的解釋,如前所示。即使 你只是謹慎,這可能不是一個壞主意。
我想我明白了,但是你引用的文本沒有提及任何函數調用(同樣,函數在文本中還沒有被覆蓋)。當然,定義返回整數的函數是不好的做法,以便可以使用函數名稱對數組進行索引,是嗎?或者是否有一些情況經常出現,如果這是有道理的?另外,你能否指點我到書中某處,以這種方式對數組進行索引解釋? – clarkb86 2012-03-12 02:43:54
@ clarkb86是的,有一種情況是有道理的。當你使用一個數組作爲一個對象,並使用不同的插槽來保存不同的東西。通常情況下,你只需要使用散列,但有時會使用一個數組,而當它使用時,通常會爲索引使用命名常量。重點在於,這在技術上是模棱兩可的,有時你必須使用解決方法。我們要在這裏解釋它,而不是等到我們談論用戶定義的函數,因爲這裏是我們所談論的陣列插值。 – tchrist 2012-03-12 02:49:35
的Fe,所有的'@在http://poe.perl.org/?POE_Cookbook/Chat_Server – 2012-03-12 02:56:59
sub bar { 1 }
唉,我不能提交孤單;對於SO來說太短了。所以,這是在Perl中表達常量的一種方式。例如,sub MAGIC_NUMBER { 0x7774 }
+1,但恕我直言,高級習慣用法是'使用常量欄=> 1;(它具有相同的效果,但更清楚地表明'bar'是一個常量函數)。 – ruakh 2012-03-12 02:06:02
@Alan,如果你想知道2 + 2是什麼,'4'是一個驅動器的答案。這也是*答案。如果關於SO的每個問題和答案都是智慧書中的一頁,但是你不回答未經詢問的問題(「什麼是補充?」,「誰發明了'加號'? 「,」在多團體社區中'2 + 2 = 1'是什麼意思?「)。 – 2012-03-12 03:19:02
(我不得不刪除我的第一條評論,我不知道那裏發生了什麼。)最小長度要求鼓勵您考慮可能包含的其他信息。但請提供有用的信息。如果問題如此簡單,以至於你只能回答這個問題,也許這就是不屬於這裏的*問題*。 ;) – 2012-03-12 09:32:27
bar
可以是一個函數:
perl -le 'sub bar() { 1 } my @foo = qw(hello world); print m/${foo[bar]}/ ? "$_ -> TRUE" : "$_ -> FALSE" for qw(hello world)'
- 1. 避免在以下語句中重複代碼:isset($ _ GET ['foo'] ['bar'])? $ _GET ['foo'] ['bar']:NULL;
- 2. QR代碼是否有效?
- 3. Haskell代碼是否有效?
- 4. [foo,bar] = [「foo」,「bar」]功能的名稱是什麼?
- 5. 該語法是否有效?
- 6. 這是否是有效的Elixir語法?
- 7. 這是否是有效的PHP語法?
- 8. 是否有可能爲特定的Perl類獲取所有有效的方法?
- 9. 是否有可能循環此語法
- 10. 是否有可能在Xcode上的iOS上運行perl?
- 11. Clojure中foo,:: foo,:: bar/foo和bar/foo之間的區別是什麼?
- 12. 在javascript中,`{foo:「bar」}`和`{「foo」:「bar」}`有什麼區別?
- 13. 在PHP中$ bar = boolval($ foo)和$ bar =(bool)$ foo有什麼區別?
- 14. 是否有可能直接在代碼中有錯誤描述?
- 15. 是否有可能在JavaScript函數中有php代碼?
- 16. 語法'foo(a)(b)`可能有用嗎?
- 17. 重寫index.php?foo = bar & bar = foo到index.php?foo = bar&bar = foo
- 18. 代碼中的函數執行順序如foo(bar())是什麼?
- 19. CoffeeScript中的{bar} = foo聲明語法是什麼?
- 20. 是否有可能在沒有在Windows上創建用戶的情況下檢查密碼是否有效?
- 21. 觸控筆中的'(foo bar)'和'foo bar'有什麼不同?
- 22. 是否有可能在x86-64上將代碼注入堆棧
- 23. 是否有可能在UITableViewCell上有「touchesBegan」?
- 24. 在Perl中是否有與PHP中的imagecolorset等效的PHP代碼?
- 25. 這是否有效的reactJS代碼?
- 26. Preg_replace:「foo」,「bar」,「foo bar」和「bar foo」
- 27. Perl和閉包。是否有可能?
- 28. 我的preg_match語法是否有效?
- 29. 是否有可能在Java8流中重寫這樣的代碼?
- 30. 是否有可能在代碼中檢索LinearGradientBrush的角度?
你可以只是把它們都在一個程序中,並找出他們是否編譯。 perl的-c開關會告訴你它們是否在語法上無效。 – 2012-03-12 05:33:17