2011-11-14 6 views
3

内の単語の連続したペアを取得する方法:私たちは、言葉のすべての可能な連続したペアを取得したいこの文ではPerl

my $sent = "Mapping and quantifying mammalian transcriptomes RNA-Seq"; 

コンパクトな方法はありますか?

+0

回答が異なります。どちらをお望みでしたか? – ysth

答えて

7

はい。

my $sent = "Mapping and quantifying mammalian transcriptomes RNA-Seq"; 
my @pairs = $sent =~ /(?=(\S+\s+\S+))\S+/g; 
+0

非常に涼しい、あなたが先読みでキャプチャすることがわかりませんでした。 –

2

これは動作します。

my @sent = split(/\s+/, $sent); 
my @var = map { $sent[$_] . ' ' . $sent[$_ + 1] } 0 .. $#sent - 1; 

即ちだけ単語の配列に元の文字列を分割し、その後反復所望のペアを生成するmapを使用します。

1

私は1行ではありませんが、次のコードはどこかで起動する必要があります。基本的にはpush/gの正規表現で行います。

#!/usr/bin/perl 

use strict; 
use warnings; 

use Data::Dumper; 
$Data::Dumper::Indent = 1; 

my $t1 = 'aa bb cc dd ee ff'; 
my $t2 = 'aa bb cc dd ee'; 

foreach my $txt ($t1, $t2) 
{ 
    my @a; 
    push(@a, $&) while($txt =~ /\G\S+(\s+\S+|)\s*/g); 
    print Dumper(\@a); 
} 

ワンライナーあなたは言葉の奇数、まだエントリーを取得し、最後の言葉を持っている場合

my @a = $txt =~ /\G(\S+(?:\s+\S+|))\s*/g; 

@ysthから私の正規表現は、そのわずかに異なる構文のおかげです。

2

オペレータの評価の順序に依存していますが、派手な正規表現または指標に依存しない(おそらく、愚かに)変化:彼らは言葉の間、元の空白を維持するか、単にスペースを使用するかどうか

my @words = split /\s+/, $sent; 
my $last = shift @words; 
my @var; 
push @var, $last . ' ' . ($last = $_) for @words;