Простой вопрос: как удалить n-е слово в строке - PullRequest
1 голос
/ 15 марта 2011

Как удалить n-е слово в строке?например, я хотел бы удалить третье слово;входная строка: один два три четыре пять;выходная строка: один два четыре пять;

open (IN, "<$input") or die "Couldn't open input file: $!";
open (OUT, ">$output") or die "Couldn't create input file: $!";
while (my $line = <IN>) {
    # line =~ regexp; Dunno what
    print OUT "$sLine";
}

Ответы [ 5 ]

2 голосов
/ 15 марта 2011
print OUT join(' ', splice(split(/ */,$line), 2, 1));
2 голосов
/ 15 марта 2011
$subject =~ s/^(\s*(?:\S+\s+){2})\S+\s+(.*)$/$1$2/g;

удалит третье слово, где «слово» является третьим вхождением смежных непробельных символов.

Объяснение:

^         # start of string
(         # Capture the following in backreference $1:
 \s*      # optional whitespace
 (?:      # Match the following group...
  \S+     # one or more non-space characters
  \s+     # one or more whitespace characters
 ){2}     # ... exactly twice.
)         # End of capture $1
\S+\s+    # Match the third word plus following whitespace
(.*)      # Match and capture the rest of the string
$         # until the end
0 голосов
/ 16 марта 2011

В ответ на комментарии @Ted Hopp я решил посмотреть, смогу ли я сделать это, сохранив пробел.Я также поставил условие, что делать с пробелами до и после удаленного слова.Да, это излишне, но я откладываю делать что-то еще.

#!/usr/bin/perl

use strict;
use warnings;

my $word_to_remove = 3;
my $remove_leading_space = 0;
my $remove_trailing_space = 1;

while(my $in_string = <DATA>) {
  chomp $in_string;

  my @fields = split(/(\s+)/, $in_string);

  my $field_to_remove = 2*$word_to_remove - 2;  
  #back up the splice position if removing leading space
  $field_to_remove -= ($remove_leading_space) ? 1 : 0;
  #move forward if there are is a leading portion of whitespace
  $field_to_remove += ($fields[0] eq '') ? 2 : 0;

  my $total_to_remove = 
    1 + 
    (($remove_leading_space) ? 1 : 0) + 
    (($remove_trailing_space) ? 1 : 0);

  splice(@fields, $field_to_remove, $total_to_remove);
  my $out_string = join('', @fields);
  print $out_string . "\n";
}

__DATA__
one two four five
one two  four five
  one two   four  five
0 голосов
/ 16 марта 2011
my $x = "one two three four five six seven";

my $nth = 4;
my $i;

$x =~ s/(\b\S+\s*)/ $1 x ( ++$i != $nth ) /eg;

print $x;

Хитрость здесь заключается в использовании оператора повторения.«$ foo x $ boolean» оставит $ foo как есть, если $ boolean равно true, и превратит его в пустую строку, если это false.

0 голосов
/ 15 марта 2011

Не такой компактный, как решение для регулярных выражений, но, возможно, более читабельный.

sub delete_nth
{
  my $n = shift;
  my $text = shift;

  my @words = split(/ /,$text );
  delete $words[$n-1];

  return join(" ",@words);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...