2011-09-07 4 views
4

나는 배열이 aa:bb::cc, yy, zz 인 방식으로 분할해야하는 문자열 aa:bb::cc:yy:zz이 있습니다. 즉, 마지막으로 :이라는 구분 기호로 두 개의 하위 문자열을 만들고 배열의 요소로 남기고 싶습니다. 이것을 달성하는 가장 좋은 방법은 무엇입니까?펄 : 분할하는 방법?

는 예 : 다시 IP, 포트, 프로토를 얻을 수 사물이 잘 때 IP 주소를 작업했다 ""는 파일에서 키를 분리 사랑의 같은 프로토콜을 : 포트 :

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 주소를 저장 Ipv4로 제한됩니다. 이제 Ipv6로 포팅되어 IP 주소에 ":"가 포함되어 있으므로 ":"로 분할하여 적절한 IP 주소를 얻을 수 없습니다.

+0

저장하는 것이 안전 할 것이다 당신'(IP, 포트)'표준화'[IP 주소]를 사용하여 쌍 : 포트 '형식. [AnyEvent :: Socket] (https://metacpan.org/module/AnyEvent::Socket) 모듈에있는'parse_hostport' /'format_hostport'는 그것을 처리하는데 유용합니다. – dolmen

답변

11

에 대해 어떻게 :

#!/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") 
+0

'dd : ff'또는 'dd'와 같이 'two or less pairs pairs'문자열에서 실패 할 것입니다. – yko

+0

은 3 개의 매개 변수 중 miminum을 기대하기 때문에 문제가되지 않습니다. – kumar

+0

THanks M42, 나를위한 완벽한 솔루션. – kumar

3
$ perl -wE '$_="aa:bb::cc:yy:zz"; say join "\n", split /:([^:]+):([^:]+)$/, $_;' 
aa:bb::cc 
yy 
zz 

업데이트 : 당신은 언급하지 않았다 이것은 IP 주소를 분석하는 것을 의미했다. 이 경우, 당신은 아마에 모듈을 찾기 위해 노력하고 더 좋을 것 CPAN

+0

TLP 덕분에, 이것은 또한 매력처럼 작동합니다. – kumar

+0

@ kumar 환영합니다. 기본적으로 M42와 같은 솔루션입니다. – TLP

2
$ 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 
3

나는 할 거라고 지나치게 공격적인 split 다음에 참여. 결과를 훨씬 더 읽을 때 분할에 대한 복잡한 정규식을 사용하지 않는 것 같아요. 그래서 :

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에 확인해야 할 것입니다.

4

$ 문자열이 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')