2013-06-26 65 views
2

打印所以這裏是正在運行的代碼片段:非常奇怪的錯誤。當在Perl

if($verbose){ 
      my $toPrint = "Added "; 
      if($types[$count]){ 
        $toPrint .= "$types[$count] "; 
        print "Type: $types[$count]\n"; #Manual debugging 
        print "\$toPrint: $toPrint\n"; #Manual debugging 
      } 
      if($addressTypes[$count]){ 
        $toPrint .= "$addressTypes[$count] "; 
        print "Address Type: $addressTypes[$count]\n"; #Manual debugging 
        print "\$toPrint: $toPrint\n"; #Manual debugging 
      } 
      if($addresses[$count]){ 
        $toPrint .= "$addresses[$count] "; 
        print "Address: $addresses[$count]\n"; #Manual Debugging 
        print "\$toPrint: $toPrint\n"; #Manual debugging 
      } 
      $toPrint .= "to the address entries\n"; 
      print "Final value of \$toPrint before printing: $toPrint\n"; #Manual debugging 
      print $toPrint; 
    } 

我們內部的for循環,與$count是我們的迭代變量。以下是此代碼的特定runthrough的輸出結果。爲了保護隱私,我用###。###。###。###替換了IP中的IP。

Type: zix01 
    $toPrint: Added zix01 
    Address Type: A 
    $toPrint: Added zix01 A 
    Address: ###.###.###.### 
    toPrint: Added zix01 A ###.###.###.### 
    to the address entries before printing: Added zix01 A ###.###.###.### 

    to the address entries#.### 

正如你所看到的,這有幾個問題。

  1. 以「地址」開頭的行以空格開頭,而不是打算的$。
  2. 之後的行以「到地址條目」開始,而不是「$到打印的最終值」。
  3. 該行在結尾處也沒有「地址條目」。
  4. 最後兩行之間有一個額外的換行符。
  5. 最後一行不包含單詞「添加zix01 A」,即使它應該打印的變量確實如此。
  6. 最後一行也不包括它應該打印的IP,除了最後5個字符以外,這些字符在字符串的其餘部分之後但在換行符之前出現。

有沒有人有任何想法這裏發生了什麼?

編輯爲語法。

+0

這不一定與您的問題有關,但我已經看到由打印輸出緩衝區引起的各種奇怪的打印行爲。把它放在腳本的頂部,試着關掉它:$ | = 1; – Magnus

回答

5

您的輸出中是否有回車符(\r)?在Unix上使用perl script.pl | od -c來檢查輸出的每個字符。

在Windows中生成的文件通常有\r\n行結束符。當這些文件在Unix環境中讀取時,chomp只會刪除\n。當我不得不擔心可移植性時,我通常跳過chomp,並在輸入上只輸入s/\s+$//(或s/[\r\n]+$//,如果您不想去除所有尾隨空格)。

+0

這裏似乎有回車。該腳本正在對Windows中生成的.csv文件進行操作,該文件可能來自哪裏。我在每一個明智的機會上都使用了'chomp',所以我不確定它們爲什麼仍然存在。馬車可能會成爲問題嗎? – deviks

+0

看起來像回車導致問題。配置成'od -c'我可以看到所有預期的輸出,並且在每個輸出看起來沒有'od'的情況下都會出現一個回車。現在將測試你的'chomp'替代品。 – deviks

+0

您也可以嘗試運行實用程序'dos2unix'來刪除CRLF行尾。 – devnull