2012-03-12 40 views
4

我正在通過O'Reilly編程Perl第3版閱讀,文中指出,不應使用歧義搜索模式/$foo[bar]/,而應使用/${foo[bar]}/,以便Perl不會將[bar]誤認爲字符類。我是否錯過了某些東西,或者這兩個語句在語法上都是不正確的,因爲它們試圖使用空字符串來索引數組?我在網上查了這本書的勘誤表,在書中找不到任何提及這是一個錯誤。是否有一些我可以忽略的代碼可能是有效的?

+1

你可以只是把它們都在一個程序中,並找出他們是否編譯。 perl的-c開關會告訴你它們是否在語法上無效。 – 2012-03-12 05:33:17

回答

8

我通過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]和 幾乎總是正確的。如果它猜錯了,或者你只是普通的偏執狂, 你可以用大括號強制正確的解釋,如前所示。即使 你只是謹慎,這可能不是一個壞主意。

+0

我想我明白了,但是你引用的文本沒有提及任何函數調用(同樣,函數在文本中還沒有被覆蓋)。當然,定義返回整數的函數是不好的做法,以便可以使用函數名稱對數組進行索引,是嗎?或者是否有一些情況經常出現,如果這是有道理的?另外,你能否指點我到書中某處,以這種方式對數組進行索引解釋? – clarkb86 2012-03-12 02:43:54

+0

@ clarkb86是的,有一種情況是有道理的。當你使用一個數組作爲一個對象,並使用不同的插槽來保存不同的東西。通常情況下,你只需要使用散列,但有時會使用一個數組,而當它使用時,通常會爲索引使用命名常量。重點在於,這在技術上是模棱兩可的,有時你必須使用解決方法。我們要在這裏解釋它,而不是等到我們談論用戶定義的函數,因爲這裏是我們所談論的陣列插值。 – tchrist 2012-03-12 02:49:35

+0

的Fe,所有的'@在http://poe.perl.org/?POE_Cookbook/Chat_Server – 2012-03-12 02:56:59

4
sub bar { 1 } 

唉,我不能提交孤單;對於SO來說太短了。所以,這是在Perl中表達常量的一種方式。例如,sub MAGIC_NUMBER { 0x7774 }

+2

+1,但恕我直言,高級習慣用法是'使用常量欄=> 1;(它具有相同的效果,但更清楚地表明'bar'是一個常量函數)。 – ruakh 2012-03-12 02:06:02

+2

@Alan,如果你想知道2 + 2是什麼,'4'是一個驅動器的答案。這也是*答案。如果關於SO的每個問題和答案都是智慧書中的一頁,但是你不回答未經詢問的問題(「什麼是補充?」,「誰發明了'加號'? 「,」在多團體社區中'2 + 2 = 1'是什麼意思?「)。 – 2012-03-12 03:19:02

+2

(我不得不刪除我的第一條評論,我不知道那裏發生了什麼。)最小長度要求鼓勵您考慮可能包含的其他信息。但請提供有用的信息。如果問題如此簡單,以至於你只能回答這個問題,也許這就是不屬於這裏的*問題*。 ;) – 2012-03-12 09:32:27

0

bar可以是一個函數:

perl -le 'sub bar() { 1 } my @foo = qw(hello world); print m/${foo[bar]}/ ? "$_ -> TRUE" : "$_ -> FALSE" for qw(hello world)' 
相關問題