我在Perl中的哈希已被傾倒進一些遺留代碼項的名稱已經從簡單地改變REQHDRS到reqHdrs.bla現在如何使用具有字面點的Perl哈希鍵?
$rec->{reqHdrs.bla}
我的問題是我似乎無法訪問此場從哈希任何想法? 以下是我的錯誤
Download Script Output: Bareword "reqHdrs" not allowed while "strict subs" in use
我在Perl中的哈希已被傾倒進一些遺留代碼項的名稱已經從簡單地改變REQHDRS到reqHdrs.bla現在如何使用具有字面點的Perl哈希鍵?
$rec->{reqHdrs.bla}
我的問題是我似乎無法訪問此場從哈希任何想法? 以下是我的錯誤
Download Script Output: Bareword "reqHdrs" not allowed while "strict subs" in use
如果該鍵是一個字符串,只是:
$rec->{"reqHdrs.bla"}
...如果使用單引號(''')而不是雙引號('「')字符串,則性能增益非常微小;) – 2010-04-15 17:14:31
@Carl:爲什麼單引號更快? – 2010-04-15 17:18:57
@Eli:單引號不插入 – 2010-04-15 17:22:15
的裸字reqHdrs.bla
真的只是一個...代名詞,我想,對於一個字符串。我並不完全確定,但我認爲您應該可以簡單地使用一個字符串,例如'reqHdrs.bla'
作爲您的密鑰,並應該檢索您的值確定。
括在引號中的鍵:
$rec->{'reqHdrs.bla'}
如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',
};
Upvote爲最全面和有用的答案的很多。 :) – 2010-04-15 17:29:02
根據perldoc perldata
當使用一個標識符在curlies內,例如當通過一個鍵訪問一個散列值時,該標識符被認爲是一個字符串,並被視爲這樣。行情將被自動假定,但是,任何更復雜的東西都可以被解釋。
事實上,這樣 花括號內的識別符被強制爲一個字符串,作爲 是散列 標內的任何簡單的標識符。都不需要引用。我們的 前面的示例
$days{'Feb'}
可以是 寫爲$days{Feb}
並且報價 將被自動假定。但 下標 中任何更復雜的內容都將被解釋爲 表達式。這意味着例如$version{2.0}++
相當於$version{2}++
,而不是$version{'2.0'}++
。
由於.
用於字符串連接,我猜想的解釋器試圖將這兩個字符串連接在一起。無論如何,只要用引號使其明確就更好,如果你有strict,它可能會拋出「裸字不允許」的錯誤。
的解決問題的方法:
$rec->{'reqHdrs.bla'}
我沒有看到以前的帖子引用了perldata中的相同片段。 – Logan 2010-04-15 17:54:14
*'我如何使用具有文字點一個Perl哈希鍵'* - 標題是有點誤導:它不是*字面點*說造成問題,但沒有引號*鍵字面*帶點。 – Wolf 2015-11-03 12:38:53