行の 2 つのドットの間にテキストを挿入しようとしていますが、プログラムは行全体を返します。
例: 次のようなテキストがあります。
perl .version 1_1 の私のサンプルデータ 1,2。
次の一致ステートメントを使用しました
$x =~ m/(\.)(.*)(\.)/;
$x の出力はバージョン 1_1 のはずですが、行全体を一致として取得しています。
次のようなことを行うのは簡単です。
#!/usr/bin/perl
use warnings;
use strict;
my @tests = (
"test one. get some stuff. extra",
"stuff with only one dot.",
"another test line.capture this. whatever",
"last test . some data you want.",
"stuff with only no dots",
);
for my $test (@tests) {
# For this example, I skip $test if the match fails,
# otherwise, I move on do stuff with $want
next if $test !~ /\.(.*)\./;
my $want = $1;
print "got: $want\n";
}
$ ./test.pl
got: get some stuff
got: capture this
got: some data you want
これを試して:
my $str = "My sampledata 1,2 for perl .version 1_1.";
$str =~ /\.\K[^.]+(?=\.)/;
print $&;
ピリオドは、文字クラスからエスケープする必要があります。
\K
以前に一致したものをすべてリセットします (後読みで置き換えることができます(?<=\.)
)
[^.]
ピリオドを除く任意の文字を意味します。
いくつかの結果について、これを行うことができます:
my $str = "qwerty .target 1.target 2.target 3.";
my @matches = ($str =~ /\.\K[^.]+(?=\.)/g);
print join("\n", @matches);
ピリオドを 2 回使用したくない場合は、次のようにします。
my $str = "qwerty .target 1.target 2.target 3.";
my @matches = ($str =~ /\.([^.]+)\./g);
print join("\n", @matches)."\n";