2013-12-12 123 views
0

將腳本從Windows機器移動到Unix系統後,我遇到了一個非常奇怪的問題。 我已經寫了看書子併成功用Perl 5.16.3測試它在Windows,但它不會在Unix下工作,用Perl 5.14.2哈希鍵中的問題

sub READIN 
{ 
my (%tmp, $val, $key); 
open (DAT, "$_[0]")or die "Thou shalt not open this file, so I generated an error: $! \n"; 
while (<DAT>) 
    { 
    chomp; 
    ($val, $key) = split (/;/); 
    #print "Value -> $val - Key_for_Hash -> $key\n"; *#DBG - Works!* 

    $tmp{$key} = exists $tmp{$key}? "$val" : $val; 

    #print "ValueH -> $tmp{$key} - Key_for_HashH -> $key\n"; *#DBG - Works!* 

    #print "KeyH-> $key - ValueH -> $tmp{$key}\n"; *#DBG - doesn't work, cuts of everything before " - ValueH....."* 

    #print "Value2 -> $val - Key_for_Hash2 -> $key\n\n";*#DBG - Works!* 

    } 
close DAT or die "Filehandle is grumpy today and dislikes your Idea to be closed as of $\n"; 
return %tmp; 
} 

輸出我的數據::自卸車IST得到這樣的:

$VAR1 = { 
' => '18.15.7.1.39.', 
' => '19.15.7.1.39.', 
' => '19.15.9.1.6.1.', 
' => '19.15.7.1.6.', 
' => '19.15.1.', 
' => '18.15.1.', 
' => '18.15.7.1.36.', 
' => '18.15.7.1.34.', 
' => '18.15.7.1.1.', 
' => '18.15.7.1.33.', 
' => '18.1.9.0', 
' => '19.15.7.1.36.', 
' => '16.15.2.1.4.1', 
' => '18.15.7.1.38.', 
' => '19.15.9.1.13.', 
' => '18.15.9.1.6.1.', 
' => '16.1.9.0', 
' => '19.15.7.1.33.', 
' => '19.15.7.1.37.', 
' => '19.1.9.0', 
' => '19.15.9.1.3.',e 
' => '19.15.7.1.4.', 
' => '19.15.7.1.38.', 
' => '19.15.7.1.34.', 
      'radioid2e' => '19.15.7.1.1.', 
' => '16.15.2.1.4.1', 
' => '19.15.7.1.35.', 
' => '18.15.7.1.35.' 
     }; 

和最後一個,這是我從文件中讀取數據:

16.1.9.0;擺脫
16.15.2.1.4.1; KAP
16.15.2.1.4.1 ; mod
18.1.9.0; RID2
18.15.7.1.35; tdmkapt2
18.15.7.1.38; tdmkapr2
18.15.7.1.34; modt2
18.15.7.1.33; modr2
18.15 .9.1.6.1; tdmkap2
18.15.7.1.36; etht2
18.15.7.1.39; ethr2
18.15.1; RT2
18.15.7.1.1; radioid2
19.1.9.0 ; rid2e
19.15.7.1.35。; tdmkapt2e
19.15.7.1.38; tdmkapr2e
19.15.7.1.34; modt2e
19.15.7.1.33; modr2e
19.15.9.1.6.1; tdmkap2e
19.15.7.1.36; etht2e
19.15.7.1.39; ethr2e
19.15.1; rt2e
19.15.7.1.4; um2e
19.15.7.1.37; lm2e
19.15.9.1.3; glokapam2e
19.15 .9.1.13。; ethkapam2e
19.15.7.1.6。; acmcpm
19.15.7.1.1。; radioid2e

有人能指出我做錯了什麼嗎?或者這是5.14.6的一般問題?

//編輯:

這是數據::自卸車輸出,我會在Windows中獲得(Perl的5.16.3):

$VAR1 = { 
     'rid2e' => '19.1.9.0', 
     'rt2' => '18.15.1.', 
     'ethkapam2e' => '19.15.9.1.13.', 
     'etht2' => '18.15.7.1.36.', 
     'etht2e' => '19.15.7.1.36.', 
     'tdmkapt2e' => '19.15.7.1.35.', 
     'tdmkapr2' => '18.15.7.1.38.', 
     'tdmkapt2' => '18.15.7.1.35.', 
     'ethr2' => '18.15.7.1.39.', 
     'ethr2e' => '19.15.7.1.39.', 
     'tdmkap2e' => '19.15.9.1.6.1.', 
     'acmcpm' => '19.15.7.1.6.', 
     'rt2e' => '19.15.1.', 
     'modt2e' => '19.15.7.1.34.', 
     'modr2e' => '19.15.7.1.33.', 
     'um2e' => '19.15.7.1.4.', 
     'radioid2' => '18.15.7.1.1.', 
     'tdmkap2' => '18.15.9.1.6.1.', 
     'rid' => '16.1.9.0', 
     'modr2' => '18.15.7.1.33.', 
     'glokapam2e' => '19.15.9.1.3.', 
     'rid2' => '18.1.9.0', 
     'kap' => '16.15.2.1.4.1', 
     'tdmkapr2e' => '19.15.7.1.38.', 
     'radioid2e' => '19.15.7.1.1.', 
     'modt2' => '18.15.7.1.34.', 
     'mod' => '16.15.2.1.4.1', 
     'lm2e' => '19.15.7.1.37.' 
    }; 
+1

你不期望輸出應該是什麼樣子,你能更好地解釋它嗎? –

+0

我期待鍵的相應值也應該在輸出像這行''radioid2e'=> '19 .15.7.1.1。','只有不同的數據當然 – user2982931

回答

5

看起來你有一個\r\n行結束那裏。取而代之的chomp,你可以嘗試使用

s/[\r\n]+$//g; 

從另一個操作系統導入文件時,如Windows這是一個常見的問題。 chomp命令從行尾刪除本地換行符(包含在變量$/中)。在Linux中,這將是\n,但在Windows中它是\r\n。因此,在linux中,您讀取一條直到\n的行,刪除\n,並且\r將光標重置爲行首,以便覆蓋行的開頭。

在現實中,這主要是一個視覺問題(除了在字符串中具有垃圾\r字符)。如果添加

$Data::Dumper::Useqq = 1; 

到你的代碼,你會看到\r字符以純文本打印出來,像這樣:

"ethr2\r" => "18.15.7.1.39.", 

你也應該瞭解以下內容:

  • 總是使用use strict; use warnings;。它會比你在代碼中使用的任何其他東西都更有幫助,學習使用它們並不困難。
  • $tmp{$key} = exists $tmp{$key}? "$val" : $val;什麼都不做,因爲"$val"$val是相同的。如果你有use warnings它會警告你,如果該鍵不與警告Use of uninitialized value $val in string
  • 因爲它是不可能的,要分割的2倍以上存在,你還不如用一個限制你的分裂:split /;/, $_, 2;
+0

是否有意義改變'$ /'? –

+0

@mpapec有各種解決方案可以更改爲適合CRLF文件的硬編碼解決方案,但我總是發現問題在於人們的文件各不相同,因此硬編碼解決方案並不可取。 – TLP

+1

啊,所以實際上他的其他代碼確實工作正常,但鍵不可見,因爲打印\ r會將光標返回到行首。棘手。 – RemcoGerlich