2016-08-15 24 views
1

我是Perl新手,需要一些幫助調試。 這裏是我當前的代碼(在底部的數據線絕密隱私):Perl對單值化的使用

use strict; 
use warnings; 

use Email::Address; 

my %matches; 
my $records = 0; 
my $recipient = ""; 
while (<DATA>) { 
    foreach my $addr (Email::Address->parse($_)) { 
     my @fields = split /\s/, $_; 
     $records = $fields[12]; 
     $recipient = $addr->address; 
     $matches{'$recipient'} += $records; 
    } 
} 
foreach my $rfc822 (keys %matches) { 
    print $matches{'$rfc822'}, " ", $rfc822, "\n"; 
} 

__DATA__ 

這是我收到的錯誤:

Microsoft Windows [Version 6.1.7601] 
Copyright (c) 2009 Microsoft Corporation. All rights reserved. 

C:\Users\redacted>C:\Perl\test4.pl 
Use of uninitialized value in print at C:\Perl\test4.pl line 18, <DATA> line 4. 
$recipient 

任何幫助,因爲我一直停留在大加讚賞這幾天,謝謝!

+5

變量不會在單引號內插,我相信你的意思'$比賽{ 「$ RFC822」}'。然而,由於'$ rfc822'是一個變量,所以您可以完全忽略引號:'$ matches {$ rfc822}' –

+2

如果您需要隱藏帖子中的敏感信息,那麼最好用代替產生相同問題的想法替代。你讓我們更容易地重現你遇到的問題,你會得到更好的質量答案。 – Borodin

回答

1

就像@HunterMcMillen所說的,當你分配給一個散列值時,你不需要引用你的變量。因此,像這樣更新代碼的以下部分。

... 
$matches{$recipient} += $records; 
} 
} 
foreach my $rfc822 (keys %matches) { 
print $matches{$rfc822}, " ", $rfc822, "\n"; 
} 
3

的原因錯誤已經解釋:你在單引號作爲哈希鍵在兩個地方

這裏有一些注意事項使用的變量名稱上你的程序

  • 對空格沒有任何稅收,所以您應該寬鬆地使用它來縮進您的語句並留出空行,以便使代碼更易於閱讀和調試。這只是禮貌地佈置您的代碼整齊,當你要求它的幫助,即使你不想做自己

  • 變量應被聲明爲晚越好,最好是在點他們是第一次使用。在這種情況下,需要全局聲明的唯一變量是%matches,因爲它需要在以下for循環的迭代中持續存在。其他的一切可以在循環中被宣佈時,它被定義

  • forforeach在功能上是相同的,因此通常最好是用每當你動心的兩個

  • 短寫split /\s+/ ,你幾乎可以肯定的意思是split ' '這是幾乎相同的,除非它不會爲第一個字段返回空字符串,如果被分割的字符串以空格開頭。 (距離split//其將個人空間中的不同。)爲split的默認參數是split ' ', $_,所以你可以只使用split這裏

  • 這是很整潔使用插值來建立一個由變量值和字符串常量字符串。 $matches{$rfc822}, " ", $rfc822, "\n"是非常更具可讀性寫成"$matches{$rfc822} $rfc822\n"

這裏是固定的錯誤,我點你的代碼考慮

use strict; 
use warnings; 

use Email::Address; 

my %matches; 

while (<DATA>) { 

    for my $addr (Email::Address->parse($_)) { 
     my @fields = split; 
     my $records = $fields[12]; 
     my $recipient = $addr->address; 
     $matches{$recipient} += $records; 
    } 
} 

for my $rfc822 (keys %matches) { 
    print "$matches{$rfc822} $rfc822\n"; 
} 

__DATA__ 
+0

謝謝!我非常感謝幫助,我對此非常感興趣,所以我一定會把所有的建議都考慮進去 – joesmith