2015-12-09 78 views
0

我遇到了一個我無法理解的奇怪問題:Perl在打印後的製表符後添加了一個空格。數據正在從協作者提供給我的製表符分隔的文件中讀取。該數據被讀取和處理由下面的代碼:Perl - 插入不需要的空白字符

my $file = shift @ARGV; 
my @g; 
open (FILE, $file); 
while (<FILE>) { 
    my $line = $_; 
    chomp $line; 
    my @fields = split("\t", $line); 
    push(@g, $fields[2]); 
    push(@g, $fields[5]); 
    push(@g, $fields[7]); 
    ... 
} 

我首先想到的是,我會在我的變量開始有一個隱藏的空白字符,所以我試圖用正則表達式去除的幾種方法沒有明顯的影響。以下代碼段所不欲以同樣的方式不管是如何修改的時@g的內容起作用的代碼:

# DEBUGGING 
foreach (@g) { print "$_"; } 
exit; 

其中印刷:

catdoghatchairpen 

但正常的代碼:

# PRINT HEADER 
print "Sample ID"; 
foreach(@g) { print "\t$_";} 
print "\n"; 

印刷:

cat*\t* dog*\t*  hat*\t* chair*\t* pen 

帶有製表符後跟每個單詞之間的空格字符。

任何想法爲什麼會發生這種情況或如何解決它?

+0

請填寫完整的工作實例。 – Sean

+0

我在單詞之間看到5個空格,但它可能是SO將標籤翻譯爲4個空格,如果您有額外空間,則會給出5個空格。 – sln

+2

我會打印單引號的數據,即。 'print''\ t'$ _'「' – sln

回答

1

無法確切地知道問題出在哪裏,而無法首先看到輸入數據是如何得到的,但是這會向您顯示每個字符串包含的內容,並可能幫助您弄清楚發生了什麼事情:

use strict; 
use warnings; 

my @g = qw(cat dog hat chair pen); 

for (@g) { 
    printf("[%s] %vX\n", $_, $_); 
} 

輸出:

[cat] 63.61.74 
[dog] 64.6F.67 
[hat] 68.61.74 
[chair] 63.68.61.69.72 
[pen] 70.65.6E 
+0

感謝您將我公開給printf()函數;我以前從來沒有聽說過,現在有一些閱讀要做。這些數字在輸出中的含義是什麼?我瀏覽過兩頁描述printf,但沒有提到這樣的輸出...... – Slavatron

+0

@Slavatron數字是字符串中每個字符的十六進制字符代碼。 –

1

這裏是轉儲任何變量,看看在它的簡單方法。在你的情況下,也許一些隱藏的字符,如轉義序列。 (https://www.gnu.org/software/gawk/manual/html_node/Escape-Sequences.html

$ perl -e 'use Data::Dumper; my @g=["cat\t", "dog\b"]; print Dumper(@g);' 

$VAR1 = [ 
     'cat ', 
      'do' 
     ]; 
+0

更好:'使用Data :: Dumper; $ Data :: Dumper :: Useqq = 1;打印Dumper \ @g;'(表示空格以外的空格作爲轉義序列,因此很容易區分製表符和一系列空格)。 – ThisSuitIsBlackNot