Perl: как разбить? - PullRequest
       12

Perl: как разбить?

4 голосов
/ 07 сентября 2011

У меня есть строка aa:bb::cc:yy:zz, которую нужно разделить таким образом, чтобы у меня был массив с aa:bb::cc, yy, zz.т.е. я хочу создать две подстроки из последней с : в качестве разделителя и оставаясь в качестве элемента массива.Каков наилучший способ добиться этого?

ex:

aa:bb::cc:yy:zz --> ['aa:bb::cc','yy','zz']

dd:ff:gg:dd:ee:ff:fg --> ['dd:ff:gg:dd:ee','ff','gg']

Я храню IP-адрес: порт: протокол в качестве ключа в файле и разделяю с помощью ":", чтобы получить IP,порт, прото обратно и все работало нормально, когда IP-адрес ограничен Ipv4.Теперь я хочу сделать его портированным на Ipv6, и в этом случае IP-адрес содержит «:», поэтому я не могу получить правильный IP-адрес, разделив его с помощью «:».

Ответы [ 5 ]

11 голосов
/ 07 сентября 2011

Как насчет:

#!/usr/local/bin/perl 
use Data::Dump qw(dump);
use strict;
use warnings;

my $x = 'dd:ff:gg:dd:ee:ff:fg';
my @l = $x =~ /^(.*?):([^:]+):([^:]+)$/g;
dump @l;

вывод:

("dd:ff:gg:dd:ee", "ff", "fg")
4 голосов
/ 07 сентября 2011

Этот код будет корректировать ситуации обработки, когда $ string содержит 2 или менее пар:

my $string = 'aa:bb::cc:yy:zz';
my @data = split /:/, $string;
if (@data > 2) {
    unshift @data, join ':', splice @data, 0, -2;
}

# $string = 'aa:bb::cc:yy:zz';
# @data contains ('aa:bb::cc', 'yy', 'zz')

# $string = 'aa:bb';
# @data contains ('aa', 'bb')
3 голосов
/ 07 сентября 2011

Я бы сделал чрезмерно агрессивный сплит с последующим объединением. Я думаю, что результат гораздо более читабелен, если вы не используете сложное регулярное выражение для разбиения. Итак:

my $string = 'aa:bb::cc:yy:zz';
my @split_string = split(/:/, $string);
my @result = (join(':', @split_string[0..scalar(@split_string)-3]), $split_string[-2], $split_string[-1]);
print join(', ', @result), "\n";

Дает вам:

aa:bb::cc, yy, zz

Вам нужно выполнить проверку границ массива на @split_string, прежде чем начать индексировать его таким образом.

3 голосов
/ 07 сентября 2011
$ perl -wE '$_="aa:bb::cc:yy:zz"; say join "\n", split /:([^:]+):([^:]+)$/, $_;'
aa:bb::cc
yy
zz

Обновление: Вы не упомянули, что это было предназначено для анализа IP-адресов. Если это так, вам, вероятно, будет лучше найти модуль на CPAN

2 голосов
/ 07 сентября 2011
$ perl -e'$_="aa:bb::cc:yy:zz"; @f=/(.*):([^:]+):(.+)/; print "$_\n" for @f'
aa:bb::cc
yy
zz

$ perl -e'$_="dd:ff:gg:dd:ee:ff:fg"; @f=/(.*):([^:]+):(.+)/; print "$_\n" for @f'
dd:ff:gg:dd:ee
ff
fg
...