0

我有这条线:
[Fri Oct 5 09:11 2012] 0.005 [ext2/1/rel 322 (0,50)] [abc] I'm Sure [he/she] is leading CORN @types (countyfair)

我如何将它从第3 个 ]中拆分出来,并有 2 个部分:

[Fri Oct  5 09:11 2012] 0.005 [ext2/1/rel 322 (0,50)] [abc]    

I'm Sure [he/she] is leading CORN @types (countyfair)   
4

3 回答 3

4

这个跳过三个]s:

use strict;
use warnings;

while (<>) {
  if (my ($p1, $p2) = (/([^]]+][^]]+][^]]+])\s*(.*)/)) {
    print "$p1 : $p2\n";
  }
}

使用数组:

my @a; 
while (<>) {
  if (@a = (/([^]]+][^]]+][^]]+])\s*(.*)/)) {
    print join(",", @a), "\n";
  }
}
于 2012-12-03T21:05:03.947 回答
1

对每个以 结尾的三个字符串进行回顾]就可以解决问题。你没有提到你想在第三个之后对空格做什么,]所以我把它留在那里。

use strict;
use warnings;

my $s = q{[Fri Oct 5 09:11 2012] 0.005 [ext2/1/rel 322 (0,50)] [abc] I'm Sure [he/she] is leading CORN @types (countyfair)};
my @pair = split /(?:[^]]*\]){3}\K/, $s;

print "$_\n" for @pair;

输出

[Fri Oct 5 09:11 2012] 0.005 [ext2/1/rel 322 (0,50)] [abc]
 I'm Sure [he/she] is leading CORN @types (countyfair)
于 2012-12-04T13:57:44.573 回答
0

我对通用函数感兴趣,所以这里是:

#!/usr/bin/env perl

use strict;
use warnings;

my $str = q{[Fri Oct 5 09:11 2012] 0.005 [ext2/1/rel 322 (0,50)] [abc] I'm Sure [he/she] is leading CORN @types (countyfair)};  #'# fix highlight

my ($first, $second) = split_after_nth( qr/]/, $str, 3 );
$second =~ s/^\s*//;  #/# fix highlight
print "$first\n$second\n";

sub split_after_nth {
  my ($qr, $str, $num) = @_;
  my @parts = split /($qr)/, $str, ++$num;
  my $second = pop @parts;
  my $first = join '', @parts;
  return ($first, $second);
}
于 2012-12-04T03:21:31.040 回答