Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从字符串中提取前50个单词(Perl)_Perl_Split - Fatal编程技术网

从字符串中提取前50个单词(Perl)

从字符串中提取前50个单词(Perl),perl,split,Perl,Split,我用Perl编写 我需要将一个字符串分为前50个单词(如果总共少于50个单词,则为整个文本)和其余单词(如果第一个单词不超过50个单词,则为空字符串) 在第一部分(前50个单词)和第二部分(其余部分),应该保留单词分隔符:换行符应该保留换行符,空格应该保留空格。我想出了这个简单的方法,但我想有一个更好的方法使用单个正则表达式 use strict; use warnings; use Data::Dumper; my $text = 'Lorem ipsum dolor sit amet, c

我用Perl编写

我需要将一个字符串分为前50个单词(如果总共少于50个单词,则为整个文本)和其余单词(如果第一个单词不超过50个单词,则为空字符串)


在第一部分(前50个单词)和第二部分(其余部分),应该保留单词分隔符:换行符应该保留换行符,空格应该保留空格。

我想出了这个简单的方法,但我想有一个更好的方法使用单个正则表达式

use strict;
use warnings;
use Data::Dumper;

my $text = 'Lorem ipsum dolor sit amet, consectetuer adipiscing
elit. Donec hendrerit tempor tellus. Donec pretium posuere
tellus. Proin quam nisl, tincidunt et, mattis eget, convallis nec,
purus. Cum sociis natoque penatibus et magnis dis parturient montes,
nascetur ridiculus mus. Nulla posuere. Donec vitae dolor. Nullam
tristique diam non turpis. Cras placerat accumsan nulla. Nullam
rutrum. Nam vestibulum accumsan nisl.';

sub wsplit {
    my ($s, $words) = @_;

    my $pos = length $s;
    my $n = 0;
    while ($s =~ /\S+/g) {
        $n++;
        if ($n == $words) {
            $pos = pos $s;
            last;
        }
    }
    return [substr($s, 0, $pos), substr($s, $pos)]
}


print Dumper(wsplit($text, 8));
输出:

$VAR1 = [
          'Lorem ipsum dolor sit amet, consectetuer adipiscing
elit.',
          ' Donec hendrerit tempor tellus. Donec pretium posuere
tellus. Proin quam nisl, tincidunt et, mattis eget, convallis nec,
purus. Cum sociis natoque penatibus et magnis dis parturient montes,
nascetur ridiculus mus. Nulla posuere. Donec vitae dolor. Nullam
tristique diam non turpis. Cras placerat accumsan nulla. Nullam
rutrum. Nam vestibulum accumsan nisl.'
        ];
假设单词的意思只是一系列非空白字符,那么只需使用一个正则表达式就可以实现。下面的一个查找N-1个连续的非空白字符序列,后跟空白字符,然后是非空白字符的进一步延伸。这是字符串的第一部分。跳过以下任何空格,然后字符串的其余部分构成第二部分

我使用了
/s
修饰符,以便正则表达式中的点
匹配任何字符,包括换行符。
/x
修饰符允许正则表达式中不重要的空格,以使其更具可读性

感谢
@knarf
提供的数据

use strict;
use warnings;

my $text = 'Lorem ipsum dolor sit amet, consectetuer adipiscing
elit. Donec hendrerit tempor tellus. Donec pretium posuere
tellus. Proin quam nisl, tincidunt et, mattis eget, convallis nec,
purus. Cum sociis natoque penatibus et magnis dis parturient montes,
nascetur ridiculus mus. Nulla posuere. Donec vitae dolor. Nullam
tristique diam non turpis. Cras placerat accumsan nulla. Nullam
rutrum. Nam vestibulum accumsan nisl.';

my ($first, $rest) = wsplit($text, 50);

print $first, "\n\n";
print $rest, "\n";

sub wsplit {
  my ($s, $n) = @_;
  --$n;
  $s =~ / ( (?: \S+ \s+ ){0,$n} \S+ ) \s* (.*) /xs;
}
输出

Lorem ipsum dolor sit amet, consectetuer adipiscing
elit. Donec hendrerit tempor tellus. Donec pretium posuere
tellus. Proin quam nisl, tincidunt et, mattis eget, convallis nec,
purus. Cum sociis natoque penatibus et magnis dis parturient montes,
nascetur ridiculus mus. Nulla posuere. Donec vitae dolor. Nullam
tristique diam non turpis. Cras placerat

accumsan nulla. Nullam
rutrum. Nam vestibulum accumsan nisl.

您不需要
拆分
,您需要一个正则表达式捕获。虽然您应该定义“单词”是什么,或者分隔符是什么。在最简单的情况下,您可以使用类似于
my($first,$rest)=$string=~/((?:\S+\S+{0,50})(.*)/S