0

わかりました、D で始まり E で終わる単語を出力する単純な Perl 5 スクリプトに行きます...

$_ = "Dog Die Do Dome";
/^d.*e$/i;

示されているように、正規表現を使用してテキストを検索し、そのような単語を見つけましたが、それらを印刷するにはどうすればよいですか? 助けてくれてありがとう。

4

5 に答える 5

4

/g修飾子を使用して、配列にキャプチャできます。

use feature 'say';
my @words = /\bd\S+e\b/ig;
say for @words;

リスト コンテキストでは、これは "d" で始まり "e" で終わるすべての一致を返します。その一致は貪欲で.*あるため、使用できないことに注意してください。単語境界を使用すると、 with などの部分一致を防ぐことができます。"dog do die"dog do die"die"\bfoobaresk

于 2012-12-31T22:08:35.677 に答える
2

まず、正規表現が文字列全体をキャプチャしていることです。正規表現は通常貪欲であるため、.*は文字列の最も長い部分に一致します。正規表現はaで始まり、dで終わるためe、文字列全体に一致します。

これを回避する方法はいくつかあります。

my $string = "Dog Die Do Dome";
my $string =~ /d[\S]+e/ig;

は空白なし\Sと言っているので、aで始まり、anで終わり、空白を含まない単語のみを一致させます。したがって、これで個別に一致しますが、とは一致しません。これは正規表現の一般的なトリックです。たとえば、文字列があり、最初の単語のみを照合したいとします。を使用すると、トリックが実行されます(これは、前述の0個以上を表すことができることを忘れないでください。したがって、少なくとも1つに一致するように2倍にします)。これは主に、Perlの拡張されたregualar式の能力がない古いバージョンのgrepまたはsedで使用されます。上記の例では、代わりにを使用しましたDEDieDomeDogDofoo-bar-bam/[^-][^-]*/*+*は、前述の1つ以上に+一致することを意味します。

*Perlには、または+:の後に疑問符を追加することにより、正規表現を貪欲でないものにする方法もあります。

my $string =~ /d.+?e/ig;

ただし、あなたの場合、これは一致Dog Dieし、Domeおそらくあなたが望むものではありません。

プログラムは次のとおりです。

use strict;
use warnings;
use feature qw(say);

my $string = "Dog Die Do Dome";

my @matches = ($string =~ /D\S+e/gi);

for my $word (@matches) {
    say "The first match is $word";
}

そして、それは印刷されます:

 The first match is Die
 The first match is Dome

さて、多分私は使うべきではありませんThe first matchが、あなたはその考えを理解します。このサンプルプログラムをさまざまな正規表現で試して、何が起こるかを確認してください。

于 2012-12-31T23:03:01.263 に答える
1
>cat temp
Dog Die Do Dome
>perl -lne '@a=split" ";foreach(@a){print if(/^[dD].*[eE]$/)}' temp
Die
Dome
于 2013-01-01T15:00:38.580 に答える
1

printステートメントを使用する

printステートメントを使用して、出力を画面に送信します。行全体を照合しているので、ここで複雑なことをする必要はありません。暗黙の$_変数を使用できます。例えば:

print if /^d.*e$/i
于 2012-12-31T22:08:29.013 に答える
0
  1 
  2 my $word_list = "Dog Die Do Dome";
  3 my @words = split ' ', $word_list;
  4 for my $word (@words) {
  5         print "$word\n" if $word =~ /^d.*e$/i;
  6     }
~            

~
~
~

于 2012-12-31T22:11:13.690 に答える