3

私はPerlを初めて使用し、ファイルを検索して追加の入力ファイルから多数の文字列をチェック/照合するスクリプトを作成しようとしています。これが私が今持っているものです:

#! /css/dvltools/localperl/bin/perl

open CUMRT603, "CUMRT603";

my $meter, $my_cur_line;
while ( <CUMRT603> )
{
        $my_cur_line = $_;
        chomp $my_cur_line;

        open METER_LIST, "mlist";
        while ( <METER_LIST> )
        {
                $meter = $_;
                if ( $my_cur_line =~ /"$meter"/ )
                {
                        print "Found $meter on $my_cur_line";
                }
        }

        close METER_LIST;
}

基本的に、リスト (mlist) で見つかった文字列を CUMRT603 で検索しています。文字列の一致を表示できません (少なくとも 1 つあるはずです)。構文、構造などに関するアドバイスは感謝します。これは基本的に私の最初の perl スクリプトです。

4

2 に答える 2

2

「正しく動作しない」とはどういう意味かを教えてください。実行するとどうなりますか?どのような結果が得られますか?どのような結果を期待しましたか?

大きな問題の1つは、の結果をチェックしていないことですopen。ファイルを開くことができない場合、他に何も正しく機能しません。からの結果は得られず、すぐ<CURMT603>に外側のwhileループを終了します。同じことがのオープンにも当てはまりますMETER_LIST

また、あなたは置く必要があります

use warnings;
use strict;

プログラムの上部にあるので、タイプミスを見つけることができます。そうでなければ、Perlはあなたがよりよく知っていると仮定しているので、物事をスライドさせますが、ここではそうではありません。

第三に、の3つの引数形式をopen使用し、字句ファイルハンドルを使用します。

第4に、変数を直接読み取ることができます。から割り当てる必要はありません$_

だからここにあなたが持っているものの簡単な書き直しがあります。

use warnings;
use strict;

open( my $cur_file, '<', 'CURMT603' ) or die "Unable to open CURMT603: $!";

while ( my $cur_line = <$cur_file> ) {
    chomp $cur_line;
    open( my $meter_file, '<', 'mlist' ) or die "Can't open meter file: $!";
    while ( my $meter = <$meter_file> ) {
        if ( $my_cur_line =~ /"$meter"/ ) {
            print "Found $meter on $my_cur_line\n";
        }
    }
    close $meter_file;
}
close $cur_file;

それで、新しいファイル処理とエラーチェックを使ってそれを試してみて、それがどうなるか見てみましょう。開いているファイルにエラーチェックを追加すると、問題が発生することは間違いありません。

mlist最後の注意:ファイルを毎回同じファイルを何度も読み直す必要はありませんがCURMT603、それは別の時間の最適化です。

于 2012-12-06T15:15:43.087 に答える
2

入力に​​achompがないため、おそらく chomped変数$meterと一致することはありません。$my_cur_line

さらに、正規表現の二重引用符は文字どおりに解釈されるため、$meterisfooの場合、 と一致させようとしますが、"foo"これがあなたの望むものかどうかはわかりません。

また、一致したテキストでメタ文字が使用されないようにすることもできます。これは quotemeta または\Q ... \E.

つまり、コードはおそらく次のようになります。

chomp $meter;
if ( $my_cur_line =~ /\Q$meter\E/ )

あなたも本当に使うべきです

use strict;
use warnings;

学習曲線が短いことは、デバッグの時間を節約する上で重荷になります。

于 2012-12-06T15:24:38.133 に答える