Как получить последовательные пары слов в Perl - PullRequest
3 голосов
/ 14 ноября 2011

С этим предложением:

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

Мы хотим получить все возможные последовательные пары слов.

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

Существует ли компактный способ сделать это?

Ответы [ 4 ]

7 голосов
/ 14 ноября 2011

Да.

my $sent = "Mapping and quantifying mammalian transcriptomes RNA-Seq";
my @pairs = $sent =~ /(?=(\S+\s+\S+))\S+/g;
2 голосов
/ 14 ноября 2011

Вариант, который (возможно, неразумно) зависит от порядка вычисления операторов, но не зависит от причудливых регулярных выражений или индексов:

my @words = split /\s+/, $sent;
my $last = shift @words;
my @var;
push @var, $last . ' ' . ($last = $_) for @words;
2 голосов
/ 14 ноября 2011

Это работает:

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

т.е. просто разбейте исходную строку на массив слов, а затем используйте map, чтобы итеративно получить нужные пары.

1 голос
/ 14 ноября 2011

У меня нет одной строки, но следующий код должен дать вам возможность начать.В основном делает это с 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;

Мое регулярное выражение немного отличается в этомесли у вас нечетное количество слов, последнее слово все равно получает запись.

...