2
   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))
4

5 に答える 5

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))
于 2011-09-12T10:20:40.043 に答える
2

これでうまくいくはずです。line.txt には、「タイトル: サッカー チーム: レアル マドリード スタジアム: サンティアゴ ベルナベウ 選手: ジネディーヌ ジダン、ロナウド、ルイス フィーゴ、ロベルト カルロス、ラウル スタッフ: ジョゼ モウリーニョ (ヘッド コーチ) アイトール カランカ (アシスタント コーチ (es))」が含まれます。

#!/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";
}
于 2011-09-12T10:27:46.687 に答える
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'
   }
于 2011-09-12T13:38:30.157 に答える
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;
于 2011-09-12T10:20:41.067 に答える
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);
于 2011-09-12T10:21:25.293 に答える