打印每个句子的第三个单词

时间:2011-08-10 10:15:52

标签: perl

use warnings;

$reff_filepath="/home/sharma/Documents/ref.txt";
open (CONFIG,"<","$reff_filepath")or die "Unable to open $reff_filepath: $!";

while(<CONFIG>) {
    chomp;
    @cols = (split(/ /))[2];
    push(@array, @cols);
    print "@array\n";
}

close CONFIG;

我得到的输出是:

  


  公民投票   关于公投法案   在全民投票比尔压倒性的   在公投上,压倒性的法案压倒了   在全民投票上,压倒性的法案宣告了比尔   在全民投票法案压倒性地声称比尔政府

但我的预期输出是

  


  公投
  比尔
  铺天盖地
  声称
  比尔
  型政府

解释:我正在尝试使用Perl打印每个句子的第三个单词。上面我写了我的Perl脚本。我得到了我在上面所期望的输出。但是我将这个输出推送到数组中,就像这样push(@array, @cols)然后我得到了我上面提到的第一个输出。请任何人给出建议或重写Perl脚本以显示我期望的输出。

4 个答案:

答案 0 :(得分:1)

如果您想打印每个第三个字,请使用

@cols = grep {not ++$i % 3} (split /\s+/)

答案 1 :(得分:0)

您正在循环的每次迭代中打印数组。

您需要在循环外移动“print”,并为数组的每个元素添加“\ n”:

push(@array, @cols);

}
print "$_\n" foreach @arr;

答案 2 :(得分:0)

打印出每行第三个单词(不是句子)的一行解决方案 - 它不会打印出少于3个单词的空行:

perl -e '@a = map { (split /\s+/)[2] } <>; $" = "\n"; print "@a\n";'

此解决方案将打印空行,其中少于3个单词:

perl -e 'print map { (split /\s+/)[2] . "\n" } <>;'

答案 3 :(得分:-1)

如何将输入分隔符定义为“。”?

$/ = .;

while(<>) {
  $i = 0;
  @words = split(/\s+/);
  while ($i <= $#words) {
     push (@array, @words[$i]);
     $i+=3;
  }
}
print "@array\n";

或类似的东西(我没有尝试运行此脚本)。你不要试图得到每个句子的每个第三个单词,而是整个文档中的每个第三个单词。