2011-11-14 63 views
3

有這樣一句話:如何獲得連續的雙字在Perl

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

我們希望得到所有可能的連續雙字。

my $var = ['Mapping and', 
      'and quantifying', 
      'quantifying mammalian', 
      'mammalian transcriptomes', 
      '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

我沒有它作爲一個單一的行,但下面的代碼應該給你開始的地方。基本上它與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); 
} 

一個襯墊感謝語法從@ysth

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

我的正則表達式是在稍有不同,如果你有奇數的話,最後一個字仍然得到一個條目。

2

是(也許是不明智)依賴於運營商的評估順序,但不靠花哨的正則表達式或指數的變化:他們是否保持單詞之間的空格原或只使用一個空間

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