如何在Perl中获取连续的单词对

时间:2011-11-14 04:54:47

标签: perl split

用这句话:

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

我们想要获得所有可能的连续单词。

my $var = ['Mapping and',
           'and quantifying',
           'quantifying mammalian',
           'mammalian transcriptomes',
           'transcriptomes RNA-Seq'];

有一种紧凑的方法吗?

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

这有效:

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

即。只需将原始字符串拆分为一个单词数组,然后使用map迭代生成所需的对。

答案 2 :(得分:2)

(可能不明智地)依赖于运营商评估顺序但不依赖于花哨的正则表达式或索引的变体:

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

答案 3 :(得分: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;

我的正则表达式略有不同,如果你有一个奇数个单词,最后一个单词仍然会有一个条目。