マッチした正規表現の一部を取り出す。

チームリーダがPerlで悶えているので話を聞いてみる。
どうも以下のようなことをしたいらしい。

my $data = 'Abc.dEf.gHI.com';
$data =~ m/ghi.com|def.ghi.com/i;
とした際に、マッチした正規表現のパターンで最長のものを取得したい。
(この場合は"def.ghi.com"を取得したい)

評価した文字列のどこがマッチしたかを調べるのであれば、
マッチ変数の"$&"を使えばいい。

が、今回の場合はそれだと、"dEf.gHI.com"が取得される。
で、何とかならんかと、以下のような実装を考えてみました。

use strict;
use warnings;

my $pattern = "ghi.com|def.ghi.com";
my $data = "Abc.dEf.gHI.com";

my @sorted = sort {length $a >= length $b} 
  grep { $data =~ /$_/i } split(/\|/, $pattern);
print pop(@sorted);

パターンの書き方がかなり限定されてしまうのが難点。
というか別に無理にsplitなんかしなくても最初から@arrayで渡せばいいのかw