2013-06-12 2 views
0
local_addr = sjcapp [value2] 

Как вы разделяете эту строку, так что я получаю 2 значения в моем массиве т.е. array[0] = sjcapp и array[1] = value2.Разделить Perl строка с подстроки и пространства

Если я это

@array = split('local_addr =', $input) 

тогда мой array[0] имеет sjcapp [value2]. Я хочу иметь возможность разделить его на две части в моей самой функции split.

Я пытался что-то вроде этого, но это не сработало:

split(/local_addr= \s/, $input) 

ответ

2

непроверенных, но может быть, что-то вроде этого?

@array = ($input =~ /local_addr = (\S+)\s\[(\S+)\]/); 

Вместо split, это использует регулярное выражение матч в контексте списка, который дает вам множество частей, захваченных в скобках.

+0

Поскольку файл имеет согласованную структуру, не используя '' 'split''' быть быстрее и проще, чем регулярное выражение для больших наборов данных? Я использовал '' '' awk''' стиль perl "autosplit" в моем ответе ниже, но '' 'sed''' или' '' cut''' тоже мог это сделать. Конечно, perl имеет то преимущество, что он переносится :-) –

+0

Я предполагал, что это было в скрипте Perl, а не в Perl в качестве процессора командной строки, но теперь я вижу, что это может быть так. Я также предположил, что '[' и ']' были буквальными и их нужно было отбросить, что в какой-то момент требует регулярного выражения. Я сомневаюсь, что производительность будет проблемой, если файл не будет огромным, поэтому случай TMTOWTDI, я думаю :) – IMSoP

0

попробовать:

if ($input =~ /(=)(.+)(\[)(.+)(\])/) { 
    @array=($2,$4); 
}  
0

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

if($input =~ /(\S+)\s*=\s*(\S+)\s*\[\s*(\S+)\s*\]/) { 
    @array = ($2,$3); 
} 
1
~/ cat data.txt  
    local_addr = sjcapp [value2] 
    other_addr = superman [value1492] 
    euro_addr = overseas [value0] 

Если данные действительно так регулярно структурирована как это, то вы можете просто разделить на пробельных. В командной строке (см страницы perlrun(1) вручную) это проще всего с «AutoSplit» (-a), который волшебным образом создает массив полей называется @F от входа:

perl -lane 'print "$F[2] $F[3]" ' data.txt 
sjcapp [value2] 
superman [value1492] 
overseas [value0] 

В вашем сценарии вы можете изменить имя массив, и положение элементов внутри, ему shift -ную или splice -ing - возможно, в более элегантно, чем это - но это работает:

perl -lane 'my @array = ($F[2],$F[3]) ; print "$array[0], $array[1]" ' data.txt 

или, без использования AutoSplit, следующим образом:

perl -lne 'my @arr=split(" ");splice(@arr,0,2); print "$arr[0] $arr[1]"' data.txt 
Смежные вопросы