2013-12-12 78 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