用这句话:
my $sent = "Mapping and quantifying mammalian transcriptomes RNA-Seq";
我们想要获得所有可能的连续单词。
my $var = ['Mapping and',
'and quantifying',
'quantifying mammalian',
'mammalian transcriptomes',
'transcriptomes RNA-Seq'];
有一种紧凑的方法吗?
答案 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;
我的正则表达式略有不同,如果你有一个奇数个单词,最后一个单词仍然会有一个条目。