2012-09-14 101 views
2

我已经写了perl程序读取一些数据(该数据是名字,其包括由一个下划线分割字母数字字符,如SDF_233),我读,在使用为什么我的Windows上的perl程序在我的mac上不能在山狮上运行?

use strict; 
use warnings; 
use LWP::Simple; 

my $file = "names.txt"; 
open(DATA,$file); 
my @lines=<DATA>; 
close DATA; 

foreach my $line (@lines) { 
my $name = $line; 
my $otherdata; ...some more code... 

print $name . "," . $otherdata;} 

数据I打印$name所以我可以用它作为参考,当我比较回原始列表时,可以仔细检查程序是否经历了每个名称。

问:这适用于Windows - 我在我的Mac上试过同样的事情,但它不起作用。我没有输出$name,但$otherdata确实打印 - 这是为什么?下划线与此有关吗?

+0

什么Perl版本?什么Mac版本?你将哪些数据输入到脚本中,作为输出得到什么,以及你期望什么?你使用什么编码?你在哪里拆分你的数据? – amon

+0

调试时,使用[Data :: Dumper](http://search.cpan.org/perldoc?Data%3A%3ADumper)模块准确查看变量中的内容是一个非常好的主意。例如。 '使用Data :: Dumper; $数据::自卸车:: Useqq = 1;打印Dumper $ name;'。在你的情况下,你的字符串中可能会有一些空白符号,Useqq选项会逐字输出空格(和其他转义序列),例如, '\ r \ n \ 0'等 – TLP

+0

我的猜测是你在这里被行结局咬伤。因为当你读取文件时,你并没有清除行结束符,所以在某些环境中可能会以'\ r'结尾,这会导致'$ otherdata'覆盖'$ name'。尝试添加一个'chomp $ name',然后再做任何事情。 – zigdon

回答

4

你的代码肯定有chomp你没有显示。如果是这样,问题是您的数据文件格式化为Windows。具体来说,它的行以CR LF结束。在Windows上,将自动更改为LF,稍后使用chomp删除该文件。在您的Mac上,该转换不会发生,因此您将CR留在后面。您的代码输出

name\r,otherdata 

该终端显示为

,otherdata 

的解决方案是修复输入文件

dos2unix names.txt 

,或者改变

while (my $line = <DATA>) { 
    chomp($line); 
    ... 
} 

while (my $line = <DATA>) { 
    $line =~ s/\s+\z//; 
    ... 
} 

PS - 您不应该使用名为DATA的句柄。 Perl已经创建了一个名称,所以它很混乱。

PS - 使用s/[\r\n]+\z//如果您处于奇怪的情况下,必须保留尾随空格。

+0

's/[\ r \ n] + \ z //'否则可能会剥离不应剥离的空格或制表符。 – TLP

+0

是的 - 我确实有一个chomp在那里 - 我忘了添加它(在其他评论中提到这个 - 谢谢! – user1637359

+0

@TLP,'s/[\ r \ n] + \ z //''不会有剥离尾随的风险's/\ s + \ z //'是规则,'s/[\ r \ n] + \ z //'是你绝对不应该使用的异常。 ,在答案中增加了一条关于这个的注释 – ikegami

0

像所有其他人一样,我假设你有行结束问题。我会诊断它的方式,如果这是我的脚本将是...

use strict; 
use warnings; 
use LWP::Simple; 
use Data::Dumper; # My favorite debugging tool 

my $file = "names.txt"; 
open(DATA,$file); 
my @lines=<DATA>; 
close DATA; 
print Dumper(\@lines); 

foreach my $line (@lines) { 
    my $name = chomp $line; 
    print Dumper(\$name, \$line); 
    my $otherdata; 

    #...some more code... 

    print Dumper(\$otherdata); 
    print $name . "," . $otherdata; 
} 
相关问题