Perl Concat字符串截断行的开头

时间:2012-01-15 08:21:51

标签: perl variables concatenation truncate

我在perl遇到一个奇怪的问题,我似乎无法找到答案。

我有一个小脚本,可以解析来自外部的数据(无论是文件,网站等)。解析数据后,它会将其保存为CSV文件。但是,问题是当我写文件或打印来筛选数据时,它似乎是截断字符串的开头。我正在使用严格和警告,我没有看到任何错误。

以下是一个例子:

print "Name: " . $name . "\n";
print "Type: " . $type. "\n";
print "Price: " . $price . "\n";
print "Count: " . $count . "\n";

它将返回以下内容:

John
Blue
7.99
5

如果我尝试这样做:

print "$name,$type,$price,$count\n";

我得到以下结果:

,7.99,5

我尝试了以下操作以查看问题的开始位置并获取以下内容:

print "$name\n";
print "$name,$type\n";
print "$name,$type,$price\n";
print "$name,$type,$price,$count\n";

结果:

John
John,Blue
,7.99
,7.99,5

我还在学习perl,但似乎无法找出(可能由于缺乏知识)造成这种情况的原因。我尝试调试脚本,但我没有看到价格变量中的任何特殊字符会导致这种情况。

2 个答案:

答案 0 :(得分:5)

$price中的字符串以回车符结束。这导致终端将光标移动到行的开头,导致前两个字段被后面的字段覆盖。

您可能正在读取unix框中的Windows文本文件。转换文件(例如,使用dos2unix),或使用s/\s+\z//;代替chomp;

如果CR位于字符串的中间,则可以使用s/\r//g;

答案 1 :(得分:1)

根据@Mat建议我通过hexdump -C运行输出,发现有一个回车符(由十六进制值0d表示)。使用代码$price =~ s/\r//g;从文本行中删除CR修复了问题。

此外,输入文件是Windows格式而不是Unix,运行命令dos2unix来修复它。

相关问题