2014-10-14 6 views
1

Я пытаюсь разделить эти значения с двоеточиямиPerl разделить несколько запятых в строке

мой вход:

user_agent="Mozilla/5.0 (X11; Linux x86_64; rv:23.0) Gecko/20100101 Firefox/23.0" request_id=bbfd6a1f-90c4-45g52-9e7c-db5 message="Authentication success" 

Я использую этот блок кода

while (my $line = <IN>) { 
    chomp $line; 
    print "$line\n"; 
    my @values = split(/\s+/, $line); 

    foreach $data (@values) { 
     chomp $data; 
     ($key, $value) = split(/=/, $data); 
     $key =~ s/\s+//g; 
     $key =~ s/"//g; 
    } 
} 

Я получаю это выход, он занимает пространство между значениями, как разделить клавиши и значения точно от вышеуказанного входа

_1; 
Linux 
x86_64; 
rv:23.0) 
Gecko/20100101es,OU 
(X1 

Заранее спасибо

ответ

0

Это решение позволяет использовать (?|) соответствующих групп, введенных в Perl 5.10 (я думаю). Если вы не хотите сохранять в хэш, вы можете расширить линию с помощью цикла while. внутри while, ключ находится в $1, и значение находится в $2.

#!/usr/bin/env perl 

use warnings; 
use strict; 
use 5.01; 

while (<DATA>){ 
    chomp; 
    my %header; 
    $header{$1} = $2 while (/\G\s*(\S+)=(?|"([^"]*)"|(\S*))/g); #extend here 
    printf "%9s => %s\n", $_, $header{$_} for keys %header; 
} 


__DATA__ 
user_agent="Mozilla/5.0 (X11; Linux x86_64; rv:23.0) Gecko/20100101 Firefox/23.0" request_id=bbfd6a1f-90c4-45g52-9e7c-db5 message="Authentication success" 

Печатается:

message => Authentication success 
user_agent => Mozilla/5.0 (X11; Linux x86_64; rv:23.0) Gecko/20100101 Firefox/23.0 
request_id => bbfd6a1f-90c4-45g52-9e7c-db5 

Если процитировать становится более сложным, вы должны смотреть на Text::Balanced с его extract_quotelike рутина.

+0

Спасибо. он работает сейчас. – organicuser

+0

@scm: здесь принято принимать ответ, чтобы люди знали, что ваша проблема решена. –

1

Если предположить, что " не будет выглядеть как действительный характер значения,

my %hash; 
while (my $line = <IN>) 
{ 
    $hash{$1} = ($2 // $3) while $line =~ /(\w+)=(?: "(.+?)" | (\S+))/xg; 
} 
+0

Спасибо за ваш быстрый ответ. Я попробую этот метод – organicuser

0

Вы можете использовать perlretut - Alternative capture group numbering для того, чтобы фиксировать значения как приложенные, так и без пробелов.

Тогда из группы захвата расположены в ключевых пар значений, то можно непосредственно инициализировать хэш следующим образом:

use strict; 
use warnings; 

while (<DATA>) { 
    chomp; 
    my %hash = /\G([^=]+)=(?|"([^"]*)"|(\S*))\s*/g; 

    use Data::Dump; 
    dd \%hash; 
} 

__DATA__ 
user_agent="Mozilla/5.0 (X11; Linux x86_64; rv:23.0) Gecko/20100101 Firefox/23.0" request_id=bbfd6a1f-90c4-45g52-9e7c-db5 message="Authentication success" 

Выходы:

{ 
    message => "Authentication success", 
    request_id => "bbfd6a1f-90c4-45g52-9e7c-db5", 
    user_agent => "Mozilla/5.0 (X11; Linux x86_64; rv:23.0) Gecko/20100101 Firefox/23.0", 
} 

Live Demo

Смежные вопросы