title: Football team: Real Madrid stadium: Santiago Bernabeu players: Zinédine Zidane, Ronaldo, Luís Figo, Roberto Carlos, Raúl personnel: José Mourinho (head coach) Aitor Karanka (assistant coach (es))
如何使用perl将其拆分为:
title: Football
team: Real Madrid
stadium: Santiago Bernabeu
players: Zinédine Zidane Ronaldo Luís Figo Roberto Carlos Raúl
personnel: José Mourinho (head coach) Aitor Karanka (assistant coach (es))
答案 0 :(得分:7)
使用前瞻断言:
say for split /(?=\w+:)/, $real_madrid_string;
<强>输出强>
title: Football
team: Real Madrid
stadium: Santiago Bernabeu
players: Zinédine Zidane Ronaldo Luís Figo Roberto Carlos Raúl
personnel: José Mourinho (head coach) Aitor Karanka (assistant coach (es))
答案 1 :(得分:1)
这应该这样做。 line.txt包含“标题:足球队:皇家马德里体育场:圣地亚哥伯纳乌球员:ZinédineZidane,罗纳尔多,路易斯菲戈,罗伯托卡洛斯,劳尔人员:JoséMourinho(主教练)Aitor Karanka(助理教练)”
#!/usr/bin/perl
use strict;
use warnings;
my $fn="./line.txt";
open(IN,$fn);
my @lines=<IN>;
my %hash;
my $hashKey;
foreach my $line (@lines){
$line=~s/\n//g;
my @split1=split(" +",$line);
foreach my $split (@split1){
if($split=~m/:$/){
$hashKey=$split;
}else{
if(defined($hash{$hashKey})){
$hash{$hashKey}=$hash{$hashKey}.$split." ";
}else{
$hash{$hashKey}=$split." ";
}
}
}
}
close(IN);
foreach my $key (keys %hash){
print $key.":".$hash{$key}."\n";
}
答案 2 :(得分:1)
与许多人在他们的答案中所说的相反,你不需要超前(除了正则表达式),你只需要捕获分隔符的一部分,如下所示:
my @hash_fields = grep { length; } split /\s*(\w+):\s*/;
我的完整解决方案如下:
my %handlers
= ( players => sub { return [ grep { length; } split /\s*,\s*/, shift ]; }
, personnel => sub {
my $value = shift;
my %personnel;
# Using recursive regex for nested parens
while ( $value =~ m/([^(]*)([(](?:[^()]+|(?2))*[)])/g ) {
my ( $name, $role ) = ( $1, $2 );
$role =~ s/^\s*[(]\s*//;
$role =~ s/\s*[)]\s*$//;
$name =~ s/^\s+//;
$name =~ s/\s+$//;
$personnel{ $role } = $name;
}
return \%personnel;
}
);
my %hash = grep { length; } split /(?:^|\s+)(\w+):\s+/, <DATA>;
foreach my $field ( keys %handlers ) {
$hash{ $field } = $handlers{ $field }->( $hash{ $field } );
}
转储看起来像这样:
%hash: {
personnel => {
'assistant coach (es)' => 'Aitor Karanka',
'head coach' => 'José Mourinho'
},
players => [
'Zinédine Zidane',
'Ronaldo',
'Luís Figo',
'Roberto Carlos',
'Raúl'
],
stadium => 'Santiago Bernabeu',
team => 'Real Madrid',
title => 'Football'
}
答案 3 :(得分:0)
最好的方法是使用零宽度前瞻使用split
命令:
$string = "title: Football team: Real Madrid stadium: Santiago Bernabeu players: Zinédine Zidane, Ronaldo, Luís Figo, Roberto Carlos, Raúl personnel: José Mourinho (head coach) Aitor Karanka (assistant coach (es))";
@split_string = split /(?=\b\w+:)/, $string;
答案 4 :(得分:0)
$string = "title: Football team: Real Madrid stadium: Santiago Bernabeu players: Zinédine Zidane, Ronaldo, Luís Figo, Roberto Carlos, Raúl personnel: José Mourinho (head coach) Aitor Karanka (assistant coach (es))";
@words = split(' ', $string);
@lines = undef;
@line = shift(@words);
foreach $word (@words)
{
if ($word =~ /:/)
{
push(@lines, join(' ', @line));
@line = undef;
}
else
{
push(@line, $word);
}
}
print join("\n", @lines);