Perl - Как изменить каждое вхождение переменной $ в ";" в строке - PullRequest
2 голосов
/ 17 февраля 2011

Очень новый здесь, так что будьте нежны. :)

Вот суть того, что я хочу сделать:

Я хочу взять строку, состоящую из чисел, разделенных точками с запятой (например, 6; 7; 8; 9; 1; 17; 4; 5; 90) и заменить каждое число "X" точкой с запятой вместо "\ n". Число «Х» будет определяться пользователем.

Так что если:

$string = "6;7;8;9;1;17;4;5;90";  
$Nth_number_of_semicolons_to_replace = 3;

Выходные данные должны быть:

6;7;8\n9;1;17\n4;5;90

Я нашел много при изменении N-го вхождения чего-либо, но я не смог ничего найти при изменении каждого N-го вхождения чего-то, что я пытаюсь описать выше.

Спасибо за вашу помощь!

Ответы [ 6 ]

7 голосов
/ 17 февраля 2011
use List::MoreUtils qw(natatime); 
my $input_string = "6;7;8;9;1;17;4;5;90"; 
my $it = natatime 3, split(";", $input_string);
my $output_string; 

while (my @vals = $it->()) { 
    $output_string .= join(";", @vals)."\n";
}
2 голосов
/ 17 февраля 2011

Вот быстрый и грязный ответ.

my $input_string = "6;7;8;9;1;17;4;5;90";
my $count = 0;
$input_string =~ s/;/++$count % 3 ? ";" : "\n"/eg;
1 голос
/ 17 февраля 2011

Сейчас у меня нет времени на полный ответ, но это поможет вам начать.

$string = "6;7;8;9;1;17;4;5;90";  
$Nth_number_of_semicolons_to_replace = 3;
my $regexp = '(' . ('\d+;' x ($Nth_number_of_semicolons_to_replace - 1)) . '\d+);';
$string =~ s{ $regexp ) ; }{$1\n}xsmg
0 голосов
/ 18 февраля 2011

Если у вас 5.10 или выше, это может помочь:

#!/usr/bin/perl

use strict;
use warnings;

my $string = '1;2;3;4;5;6;7;8;9;0';
my $n = 3;

my $search = ';.*?' x ($n -1);

print "string before: [$string]\n";

$string =~ s/$search\K;/\n/g;

print "print string after: [$string]\n";

НТН, Пол

0 голосов
/ 17 февраля 2011
my $string = "6;7;8;9;1;17;4;5;90";
my $Nth_number_of_semicolons_to_replace = 3;

my $num = $Nth_number_of_semicolons_to_replace - 1;
$string =~ s{ ( (?:[^;]+;){$num} [^;]+ ) ; }{$1\n}gx;

print $string;

печать:

6;7;8
9;1;17
4;5;90

регулярное выражение объяснил:

s{ 
  (                   # start of capture group 1
     (?:[^;]+;){$num} # any number of non ';' characters followed by a ';' 
                      # repeated $num times
     [^;]+            # any non ';' characters
  )                   # end of capture group
  ;                   # the ';' to replace
}{$1\n}gx;            # replace with capture group 1 followed by a new line
0 голосов
/ 17 февраля 2011
sub split_x{
  my($str,$num,$sep) = @_;
  return unless defined $str;

  $num ||= 1;
  $sep = ';' unless defined $sep;

  my @return;
  my @tmp = split $sep, $str;
  while( @tmp >= $num ){
    push @return, join $sep, splice @tmp, 0, $num;
  }
  push @return, join $sep, @tmp if @tmp;

  return @return;
}

print "$_\n" for split_x '6;7;8;9;1;17;4;5;90', 3

print join( ',', split_x( '6;7;8;9;1;17;4;5;90', 3 ) ), "\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...