我编写了一个读取一些数据的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
确实打印 - 这是为什么?下划线与此有关系吗?
最佳答案
你的代码肯定有一个你没有显示的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//
。
关于regex - 为什么我在 Windows 中运行的 Perl 程序在 Mac 上的 Mountain Lion 中无法运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12428436/