我遇到了一个我无法理解的奇怪问题: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 :(得分: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
答案 1 :(得分: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'
];