2010-04-15 16 views
5

我在Perl中的哈希已被傾倒進一些遺留代碼項的名稱已經從簡單地改變REQHDRS到reqHdrs.bla現在如何使用具有字面點的Perl哈希鍵?

$rec->{reqHdrs.bla} 

我的問題是我似乎無法訪問此場從哈希任何想法? 以下是我的錯誤

Download Script Output: Bareword "reqHdrs" not allowed while "strict subs" in use 
+0

*'我如何使用具有文字點一個Perl哈希鍵'* - 標題是有點誤導:它不是*字面點*說造成問題,但沒有引號*鍵字面*帶點。 – Wolf 2015-11-03 12:38:53

回答

4

如果該鍵是一個字符串,只是:

$rec->{"reqHdrs.bla"} 
+2

...如果使用單引號(''')而不是雙引號('「')字符串,則性能增益非常微小;) – 2010-04-15 17:14:31

+0

@Carl:爲什麼單引號更快? – 2010-04-15 17:18:57

+0

@Eli:單引號不插入 – 2010-04-15 17:22:15

-1

的裸字reqHdrs.bla真的只是一個...代名詞,我想,對於一個字符串。我並不完全確定,但我認爲您應該可以簡單地使用一個字符串,例如'reqHdrs.bla'作爲您的密鑰,並應該檢索您的值確定。

3

括在引號中的鍵:

$rec->{'reqHdrs.bla'} 
17

perldoc perldata描述:

...這樣花括號內的一種標識符被強制爲一個字符串,如內的任何簡單的標識符哈希下標。都不需要引用。我們的 前面的示例$days{'Feb'}可以寫爲$days{Feb}並且引號將被自動假定。但下標 中任何更復雜的內容都將被解釋爲表達式。這意味着例如$version{2.0}++相當於$version{2}++,而不是$version{'2.0'}++

通常,如果您有一個散列鍵,其字符數超出[A-Za-z0-9_]範圍,請在大括號內使用引號(單引號或雙引號)。與正常的字符串,在雙引號內容將被解析爲任何包含變量,而單引號字符串取字面上:

use strict; use warnings; 
use Data::Dumper; 
my $x = 1; 
my %hash = (
    bare_string => 'hi there', 
    "not a bare string" => 'yup', 
); 
$hash{'$x'} = 'foo'; 
$hash{"$x"} = 'bar'; 
print Dumper(\%hash); 

打印:

$VAR1 = { 
     'bare_string' => 'hi there', 
     'not a bare string' => 'yup', 
     '$x' => 'foo' 
     '1' => 'bar', 
    }; 
+1

Upvote爲最全面和有用的答案的很多。 :) – 2010-04-15 17:29:02

5

根據perldoc perldata當使用一個標識符在curlies內,例如當通過一個鍵訪問一個散列值時,該標識符被認爲是一個字符串,並被視爲這樣。行情將被自動假定,但是,任何更復雜的東西都可以被解釋。

perldata

事實上,這樣 花括號內的識別符被強制爲一個字符串,作爲 是散列 標內的任何簡單的標識符。都不需要引用。我們的 前面的示例$days{'Feb'}可以是 寫爲$days{Feb}並且報價 將被自動假定。但 下標 中任何更復雜的內容都將被解釋爲 表達式。這意味着例如 $version{2.0}++相當於 $version{2}++,而不是 $version{'2.0'}++

由於.用於字符串連接,我猜想的解釋器試圖將這兩個字符串連接在一起。無論如何,只要用引號使其明確就更好,如果你有strict,它可能會拋出「裸字不允許」的錯誤。

的解決問題的方法:

$rec->{'reqHdrs.bla'} 
+0

我沒有看到以前的帖子引用了perldata中的相同片段。 – Logan 2010-04-15 17:54:14