0

私はこのテキストファイルを読んで、その中の単語だけを取得し、すべての種類の空白を無視します。

hello
now
    do you see this.sadslkd.das,msdlsa but 
      i   hoohoh

そしてこれは私のPerlコードです:

#!usr/bin/perl -w
require 5.004;

open F1, './text.txt';

while ($line = <F1>) {

    #print $line;
    @arr = split /\s+/, $line;
    foreach $w (@arr) {

        if ($w !~ /^\s+$/) {

            print $w."\n";
        }
    }
    #print @arr;
}
close F1;

そしてこれは出力です:

hello
now

do
you
see
this.sadslkd.das,msdlsa
but

i
hoohoh

出力には2つの改行が表示されていますが、出力は単なる単語であると期待しています。言葉を聞くにはどうすればいいですか?

4

3 に答える 3

3

すべての Perl プログラムの先頭で (コマンドライン修飾子より優先して)常に use strictandを使用し、 を使用して最初の使用ポイントで各変数を宣言する必要があります。そうすることで、Perl は他の方法では見落としがちな単純なエラーを教えてくれます。use warnings-wmy

また、 の 3 パラメータ形式でレキシカル ファイル ハンドルを使用しopen、ステータスをチェックして成功したことを確認する必要があります。Perl は終了時にすべてのファイルを閉じてくれるので、プログラムがかなりの時間実行されることが予想される場合を除き、入力ファイルを明示的に閉じることにはほとんど意味がありません。

requirePerl v5.4は本当に必要ですか? そのバージョンは 15 年前のものであり、それよりも古いバージョンがインストールされている場合は、博物館です。

あなたのプログラムは次のようになります。

use strict;
use warnings;

open my $fh, '<', './text.txt' or die $!;

while (my $line = <$fh>) {

    my @arr = split /\s+/, $line;

    foreach my $w (@arr) {
        if ($w !~ /^\s+$/) {
            print $w."\n";
        }
    }
}

:申し訳ありません。プラグマとレキシカル ファイル ハンドルは v5.6 でのみ導入されたwarningsため、私の回答の一部は無関係です。Perl の最新バージョンは v5.16 であり、アップグレードする必要があります。

Bireiが指摘したように、問題は、行の先頭に空白がある場合、最初のセパレータの前に空のフィールドがあることですデータがコンマで区切られていて、行がコンマで始まっている場合、Perl に先頭の空のフィールドを報告させたいと想像してください。

すべての非スペース文字を抽出するには、まさにそれを行う正規表現を使用できます

my @arr = $line =~ /\S+/g;

これは、単一引用符で囲まれたスペース (正規表現ではありません) であるデフォルトのパラメーターを使用してエミュレートできます。split

my @arr = $line =~ split ' ', $line;

この場合split、ユーティリティのように動作awkし、期待どおりに先頭の空のフィールドを破棄します。

$_Perlに読み取りループで変数を使用させると、これはさらに簡単になりますsplit

while (<F1>) {
    my @arr = split;
    foreach my $w (@arr) {
        print "$w\n" if $w !~ /^\s+$/;
    }
}
于 2012-10-06T13:56:37.183 に答える
2

この行が問題です:

@arr=split(/\s+/,$line);

\s+先頭のスペースの直前で一致します。' '代わりに使用してください。

@arr=split(' ',$line);
于 2012-10-06T11:53:46.790 に答える
1

私はこの行でそれを信じています:

if(!($w =~ /^\s+$/))

この行に何もないかどうかを尋ねたかったのです - 印刷しないでください。しかし、REGEX の「+」は、実際には少なくとも 1 つのスペースを強制します。

「\s+」を「\s*」に変更すると、動作することがわかります。*は0回以上なので…

于 2012-10-06T11:56:11.373 に答える