2013-04-16 2 views
0

У меня есть файл, который будет иметь такие строки,Perl Split работать с запятой

<tag host="xyz|abc" some info /> 
<tag host="ijk,cdf" some info /> 

Я получаю информацию о хосте с помощью сопоставления с образцом, и я хотел бы разделить значение хоста , По какой-то причине следующий код, похоже, не работает для запятой, хотя выглядит корректно.

if($line =~ m/(\s\S)*host=\"(\S+)\"(\s\S)*/) 
{ 
($val) = ($2); 
$val=~tr/!$()//ds; 
my @values; 
if($val =~ m/((\S+)\|(\S+))*/) 
{ 
    @values=split('\|',$val); 
} 
else 
{ 
@values=split(',',$val); 
} 
#Perform some action on Values. 
} 

Может ли кто-нибудь помочь мне в этом? Заранее спасибо.

+0

Что делает ваш вход выглядит? – squiguy

+1

Зачем ломать его в 'if-else'? Почему бы просто не разделить запятую или трубку (например, 'split/[, \ |] /, $ val;')? – vol7ron

ответ

0

В вашем коде не нужно if-else. Вы можете комбинировать условия в один штрих-код.

Изменить код так:

use strict; 
use warnings; 

if($line =~ m/(\s\S)*host=\"(\S+)\"(\s\S)*/) 
{ 
($val) = ($2); 
$val=~tr/!$()//ds; 
my @values; 
@values = split (/[,|]/,$val); 
#Perform some action on Values. 
} 
+1

Конечно, этот код не будет компилироваться под 'strict', как есть. И захваты '$ 1' и' $ 3' выглядят излишними → '/ host =" ([^ "] +)«/'будет лучшим регулярным выражением. Это регулярное выражение' split' будет иметь интересные последствия для ввода типа 'host = xyz | abc, def "'. Ограничение результирующих фрагментов на два с третьим аргументом 'split' может быть хорошей идеей. – amon

+0

Большое спасибо Kute. – Ambi

+0

Не нужно скрывать трубку в классе символов – Borodin

2

Несколько идей:

  • use strict, use warnings и некоторые отступа было бы неплохо :)

  • Где Вы писали (\s\S) я полагаю, вы знакомы с JavaScript и означают класс символов [\s\S]? Там нет необходимости, чтобы соответствовать тексту предыдущему и последующим части вы заинтересованы в

  • /s модификатора на tr/// является излишним в сочетании с /d

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

Вот как я бы написал это

use strict; 
use warnings; 

while (my $line = <DATA>) { 
    if ($line =~ m/host="(\S+)"/) { 
     (my $href = $1) =~ tr/!$()//d; 
     my @values = $href =~ /[^,|]+/g; 
     print "@values\n"; 
    } 
} 

__DATA__ 
<tag host="xyz|abc" some info /> 
<tag host="ijk,cdf" some info /> 

выход

xyz abc 
ijk cdf 
Смежные вопросы