找到符合perl的第n次匹配

时间:2011-09-08 19:58:37

标签: regex perl

  

可能重复:
  Finding the N th Occurrence of a Match line

我有多行文字:

  • 平面

我想在一行和输出中找到第一次出现“ship”:

  

这艘船是第1艘。

我希望在一行中找到第二次出现“ship”并输出:

  

这艘船是2号船。

4 个答案:

答案 0 :(得分:4)

use strict;
use warnings;
use Lingua::EN::Inflect 'ORD';

my $text = "ship plane\n ship\n car";
my @ships = $text =~ /(ship)/g;
for ( my $i = 0; $i < @ships; $i++ ) {
    my $ship_num = ORD($i + 1);
    print "The ship is the $ship_num one\n";
}

&ORD将处理您的序数后缀。

答案 1 :(得分:0)

$n = 1;
while (<>)
{
    if (m%ship%)
    {
       print "The ship is the $n th one\n"; # You can do the st, nd etc
       ++$n;
    }
}

应该工作

答案 2 :(得分:0)

perl -lne'
   if (/^ship$/) {
      ++$seen;
      print "The is a 1'\''st one" if $seen == 1;
      print "The is a 2'\''nd one" if $seen == 2;
   }
' file

或者如果你想要超过前两个:

perl -lne'
   print "The is a ", ++$seen, " one" if /^ship$/;
' file

可能有一个模块来处理找到正确的后缀。我会让你调查一下。

答案 3 :(得分:0)

这是你要找的吗?

my $th 
    =  (  ( int( $n % 100 / 10 ) != 1 )
       && [ qw<th st nd rd> ]->[ $n % 10 ]
       )
    || 'th'
    ;
print "The ship is the $n$th one."