2

我编写了一个读取一些数据的 perl 程序(数据是包含由下划线分隔的字母数字字符的名称,例如 SDF_233),我在使用时读取了该数据

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;}

我打印$name以便可以将其用作参考,以在与原始列表进行比较时仔细检查程序是否已遍历每个名​​称。

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

4

2 回答 2

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//如果您处于必须保留尾随空格的奇怪情况,请使用。

于 2012-09-14T16:54:36.427 回答
0

像所有其他人一样,我假设您遇到了行尾问题。如果这是我的脚本,我会诊断它的方式是……</p>

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;
}
于 2012-09-14T17:29:53.550 回答