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元のリストと比較するときに、プログラムがすべての名前を通過したことを再確認するための参照として使用できるように印刷します。

Q:これは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 に答える