【问题标题】:How to get consecutive pairs of words in Perl如何在Perl中获得连续的单词对
【发布时间】:2011-11-14 04:54:46
【问题描述】:

用这句话:

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

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

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

有没有一种简洁的方法可以做到这一点?

【问题讨论】:

  • 答案各不相同,是保留单词之间的原始空格还是仅使用空格。你想要哪个?

标签: perl split


【解决方案1】:

是的。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这行得通:

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

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

      【讨论】:

        【解决方案4】:

        我没有将它作为单行,但下面的代码应该会给你一个开始的地方。基本上是用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;
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-01
          • 1970-01-01
          • 2023-03-20
          • 1970-01-01
          • 2022-07-03
          • 2021-01-21
          • 2015-10-28
          • 1970-01-01
          相关资源
          最近更新 更多