Perl - 如何更改每个$变量出现的“;”在一个字符串中

时间:2011-02-17 18:22:43

标签: perl

这里很新,所以要温柔。 :)

以下是我想要做的事情的主旨:

我想取一个由分号分隔的数字组成的字符串(例如6; 7; 8; 9; 1; 17; 4; 5; 90)并替换每个“X”数字的分号用“\ n”代替。 “X”号码将由用户定义。

所以如果:

$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 个答案:

答案 0 :(得分:7)

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";
}

答案 1 :(得分:2)

这是一个快速而肮脏的答案。

my $input_string = "6;7;8;9;1;17;4;5;90";
my $count = 0;
$input_string =~ s/;/++$count % 3 ? ";" : "\n"/eg;

答案 2 :(得分:1)

现在没时间回答完整的答案,但这应该可以让你开始。

$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

答案 3 :(得分:0)

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";

答案 4 :(得分:0)

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

答案 5 :(得分:0)

如果你有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";

HTH, 保罗