0

私は次のコードを持っています:

 $st2 = quotemeta($st);
 if ( $line =~ m/$st2\z/ ) {
     print "GOOD\n";
 }
 else {
     print "BAAAAAAD\n";
 }

$lineファイルから取得します。ファイル全体を読んでから、次のことを行います。

foreach $line in @file {...}

私にとっては、BAAAAAADのみを印刷します。また、$ lineには、「clear」、「clearer」、「clearest」などの単語を含めることができますが、すべての「clear」インスタンスに一致させたい、その後、すべての「clearer」インスタンスに一致させたいなどです。注:「clear」は「clearer」または「clearest」と一致してはなりません。「クリア」にのみ一致する必要があります

4

5 に答える 5

2

まず、検索のためにファイルを調べる場合は、ファイル全体を読むのではなく、1 行ずつ検索します。プレーンな文字列のみを検索する場合を除き、quotemeta を使用する必要もありません。行のどこかに「clear」という単語を見つけたい場合は\z、検索パターンを省略します。最後に、文字列には最後の改行が含まれ\zているため、文字列の末尾が見えなくなります。chomp末尾の改行を削除するために使用します

my $st = 'clear';
while (<>) {
    chomp;
    if (m/$st\z/) {
        print "GOOD\n";
    } else {
        print "BAAAAAAD\n";
    }
}

perlreperl の正規表現の説明については、を参照してください

\z 文字列の末尾のみに一致

行のどこかでのみプレーンな文字列を検索したい場合は、単に使用できますindex

my $st = 'clear';
while (<>) {
    if (index($_, $st) != -1/) {
        print "GOOD\n";
    } else {
        print "BAAAAAAD\n";
    }
}
于 2013-01-16T18:33:44.053 に答える
1

完全に一致する単語が必要な場合は\b、単語の境界に使用します。たとえば、/\bclear\b/一致clearしますが、一致しませんclearer。これは、探している単語が文字列内の唯一の単語ではない場合に役立ちます。

于 2013-01-17T09:54:40.630 に答える
0

単語の境界を使用できます。次のスニペットは、「clear」、「clearer」、または「clearest」に一致するすべての行に一致し、一致したものを明確に示します

my @matches = qw/clear clearer clearest/;

for $line ( @lines ) {
  for ( @matches ) {
    print "GOOD: Matches $_" if $line =~ /\b$_\b/;
  }
}

次のような入力に対してこれを実行すると:

my @lines = ( 'clear', 'clearer', 'clearest', 'clear', 'clearer' );

出力は次のとおりです。

GOOD: Matches clear 
GOOD: Matches clearer 
GOOD: Matches clearest 
GOOD: Matches clear 
GOOD: Matches clearer

これはclear、行内のより大きな文の一部である場合にも機能します

于 2013-01-17T11:53:40.197 に答える
0

qr($your_var) を使ってみてください
。便利なリンクがここにあります:
http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators

于 2013-01-16T20:00:05.703 に答える
0

これが機能するものです:

my $var1 = "clear";
my $var2 = "clear";
if ($var2 eq $var1) {
    print "match\n";
}
else {
    print "no match\n";
}

これは、$var1 が「明確」な場合にも機能します (「一致しない」と表示されます)。

ご協力ありがとうございました。

于 2013-01-17T05:28:11.653 に答える