0

1 つ以上のスペースで区切られた 5 つの整数を一致させてキャプチャしたいとしましょう - 入力例:

1111 234 3333 456 7890

私はこれを行うことができます:

my $input = '1111        234            3333          456    7890';
if($input =~ /^\s*([0-9]+)\s+([0-9]+)\s+([0-9]+)\s+([0-9]+)\s+([0-9]+)/)
{
  #$1 = '1111', $2 = '234', $3 = '3333', $4= '456', $5 = '7890'
}

しかし、各 int を明示的に 5 回繰り返すのではなく、正規表現をよりシンプルに保つために、次のようなことをしたいと考えています。

my $input = '1111        234            3333          456    7890';
if($input =~ /^((\s*[0-9]+){5})/)
{
  #$1 = '1111        234            3333          456    7890';
  #$2 = ' 7890'
  #all other capture variables are undefined
}

ただし、キャプチャはうまくいかないようです。

これを行いながら、5 つのキャプチャにアクセスする方法はありますか?

さらに良いのは、不明な数のキャプチャです。

my $input = '1111        234            3333          456    7890';
if($input =~ /^((\s*[0-9]+)+)/)
{
   #foreach capture 1..N do something...
}
4

4 に答える 4

4
my @numbers = $input =~ /\d+/g;

グローバル フラグは、配列に格納されるリスト コンテキスト内のすべての一致を返します。

于 2012-04-18T22:48:36.313 に答える
0

区切り文字 (この場合は 1 つ以上のスペース) がわかっている場合は、必要なものを取得するために正規表現は必要ありません。使用できますsplit

use strict;
use warnings;

my $input = "1111        234            3333          456    7890";
my @ints=split /\s+/,$input;
print "$_\n" foreach(@ints);

次の出力が生成されます。

1111
234
3333
456
7890
于 2012-04-18T22:39:54.307 に答える
0

行のパターンは常にスペースで区切られた数字グループですか? もしそうなら、正規表現ではなく、空白に基づいて配列に分割してみませんか

@outArray = split (/ +/,$input);
于 2012-04-18T22:40:34.933 に答える
-1

次の例では、最初の 5 つの整数をキャプチャし、それが目的の場合はそれ以降を無視します。私は完全に明確ではないかもしれません。

#!/usr/bin/perl
use strict;
use warnings;

my $in = '1111        234            3333          456    7890 12 13';

my @ints = (split ' ', $in)[0 .. 4];

print "@ints\n";

版画:

1111 234 3333 456 7890

クリス

于 2012-04-18T22:57:26.730 に答える