1

私はperlが初めてです。whileループで1つの変数とともに配列の値を出力しようとすると、変数が新しい行に出力されます。

while($line=<FH>)
{
    chomp($line);
    $tem = grep(/gooty/,$line);
    if($tem==1)
    {
        $Date=$date;
        @array=split(/\|/,$line);
        $sth = "INSERT INTO TABLE VALUES $array[1],$array[2],$date \n";
    }
}
print "$sth \n";

出力:

INSERT INTO TABLE VALUES alan ,777  
,2012-07-31

代わりに、出力を次のようにします。

INSERT INTO TABLE VALUES alan ,777,2012-07-31

一行で

4

4 に答える 4

5

これは、新しい perl プログラマーにとって一般的な問題です。言う

while (defined($line = <FH>))
{
    chomp $line; # Eliminate terminating newline if there
    ...

それでも結果が正しくない場合は、MSDOS/Windows の行末を持つテキスト ファイルを、正しく処理しないバージョンの Perl (Cygwin など) を使用して読み込もうとしている可能性があります。chomp誤動作の原因となります。代わりにこれを使用して問題を回避できます。

$line =~ s/[\r\n]+$//;

これにより、行末にあるすべての行末文字が、その数に関係なく削除されます。

コードに関する追加の注意事項: and を使用すると、変数宣言が必要になるため、use strict;andを使用することで多くの問題を解決できます。電話する必要はありません。ただ言ってください。データに余分な空白が含まれる可能性がある場合、より適切な分割パターンは. これにより、垂直バー フィールド セパレータの周囲の空白が消費されます。その場合、あなたも使いたいuse warnings;myourgrepif ($line =~ /gooty/) {\s+\|\s+

$line =~ s/\s+$//; 

の代わりにchomp $line。これにより、行末文字を含む行末からすべての空白が消去されます。

于 2012-07-31T01:30:34.997 に答える
1

の最後に改行があります$linechomp分割する前に、目的の出力を取得します。

chomp $line;

perldoc -f chomp

于 2012-07-31T01:30:13.877 に答える
0

を使用する代わりに、最もクリーンな方法は、chomp行末からすべての末尾の空白を削除することです

でループを開始します

$line =~ s/\s+\z//;
于 2012-07-31T11:56:37.790 に答える
0

@array要素を空白文字で囲んだくないと思います。次に、印刷する前にトリミングする必要があります。

my $line = <FH>;

my $date = '2012-07-31'; # or whatever

if($line =~ /gooty/)
{
    my @array = split /[|]/, $line;
    foreach (@array) {
      s/^\s+//; # removes leading  whitespaces
      s/\s+$//; # removes trailing whitespaces
    }
    print "INSERT INTO TABLE VALUES $array[1],$array[2],$date \n";
}

これにより、目的の出力が印刷されます。

しかし、予期しない出力を生成したコードに与えた入力を示すまで、私には確信が持てません。$sth(または、ループとステートメントの間で変更した可能性がありますprintか?2 つの改行が追加されていますか?)

ところで:use strict; use warnings

于 2012-07-31T01:50:49.293 に答える