2013-12-12 2 views
0

Windows 시스템에서 UNIX 시스템으로 스크립트를 이동 한 후 매우 이상한 문제가 발생했습니다. 나는 읽는데 서브를 작성하고 펄 5.16.3와 Windows에서 성공을 테스트하지만 펄 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; 
} 

와 유닉스에서 나는 데이터 : 덤퍼 인도 표준시로 얻을 출력을 작동하지 않습니다했습니다 KAP
16.15.2.1.4.1,
16.15.2.1.4.1을 제거,

16.1.9.0이 :

$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.' 
     }; 

마지막으로,이 내가 파일에서 읽고 있어요 데이터입니다 ; mod,314,960,453,210 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].
19.15.7.1.33을 modt2e]. modr2e
19.15.9.1.6.1]. tdmkap2e
19.15.7.1.36]. etht2e
을 19.15.7.1.39]. ethr2e
19.15.1;.. lm2e
19.15.9.1.3;.. um2e
19.15.7.1.37 단계;
19.15.7.1.4을 rt2e glokapam2e
19.15 9.1.13 .; ethkapam2e
19.15.7.1.6.; acmcpm
19.15.7.1.1.; radioid2e

누군가 내가 잘못하고있는 것을 지적 할 수 있습니까? 아니면 5.14.6의 일반적인 문제입니까?

// 편집 :

$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 라인이 끝나는 가지고있는 것처럼 보이는 :

이 내가 Windows에서거야 데이터 :: 덤퍼 출력 (펄 5.16.3이)입니다. chomp 대신, 당신은 Windows와 같은 다른 OS에서 파일을 가져올 때 이것은 일반적인 문제입니다

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

사용하여 시도 할 수 있습니다. chomp 명령은 줄의 끝에서 원시 줄 바꿈 문자 (변수 $/에 포함)를 제거합니다. 리눅스에서는 \n이되지만, Windows에서는 \r\n입니다. 그래서 리눅스에서 \n까지 줄을 읽고 \n을 제거하면 \r은 커서를 줄 시작 부분으로 재설정하여 줄의 시작 부분을 덮어 씁니다.

실제로 이것은 주로 시각적 인 문제입니다 (문자열에 \r 문자가있는 것 외에는). 항상

  • :

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

    당신은 또한 다음을 알아야한다 : 당신은 당신의 코드에

    $Data::Dumper::Useqq = 1; 
    

    를 추가 할 경우,이 같은 일반 텍스트에서 인쇄 된 \r 문자를 볼 수 있습니다 use strict; use warnings;을 사용하십시오. 코드에서 사용할 수있는 것보다 더 많은 도움을 주며, 사용법을 배우는 것이 그리 어렵지 않습니다.

  • $tmp{$key} = exists $tmp{$key}? "$val" : $val;은 아무런 이유가 없습니다. 왜냐하면 "$val"$val이 동일하기 때문입니다. split /;/, $_, 2;
: 당신이 use warnings이있는 경우 키가 경고 당신이 2 회 이상 분할 할 가능성 때문에 Use of uninitialized value $val in string
  • 에 존재하지 않는 경우 그것은 당신이뿐만 아니라 당신의 분할에 제한을 사용할 수, 경고합니다
  • +0

    변경하는 것이 의미가 있습니까? '$ /'? –

    +0

    @mpapec CRLF 파일에 맞게 하드 코드 된 솔루션으로 변경하는 방법은 다양하지만 사람들의 파일이 다양하기 때문에 하드 코딩 된 솔루션이 바람직하지 않다는 것이 항상 발견됩니다. – TLP

    +1

    아, 나머지 코드는 제대로 작동하지만, 키를 인쇄하면 \ r이 (가) 커서를 줄의 시작 부분으로 반환하기 때문에 키가 보이지 않습니다. 교활한. – RemcoGerlich