我在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,但似乎无法找出(可能由于缺乏知识)造成这种情况的原因。我尝试调试脚本,但我没有看到价格变量中的任何特殊字符会导致这种情况。
答案 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
来修复它。