2012-04-10 4 views
0

SNMP 쿼리에서 생성 된 배열에서 인터페이스를 추출하려고합니다. 내가 본 일을 오전배열에서 텍스트 추출 - perl

my @array = 
("orem-g13ap-01 Gig 11/8   166   T  AIR-LAP11 Gig 0", 
    "orem-g15ap-06 Gig 10/1   127   T  AIR-LAP11 Gig 0", 
    "orem-g15ap-05 Gig 10/4   168   T  AIR-LAP11 Gig 0", 
    "orem-g13ap-03 Gig 10/2   132   T  AIR-LAP11 Gig 0");> 

을 : 그것은 현재 다음과 같습니다

my @array = ("Gig 11/8", 
       "Gig 10/1", 
       "Gig 10/4", 
       "Gig 10/2"); 

:

는이 같은 배열을 만들려면

foreach $ints (@array) { 
     @gig = substr("$ints", 17, 9); 
     print("Interface: @gig"); 

물론 작동을하지만, 호스트 이름 [orem-g15ap-01]이 항상 같은 길이를 유지하는 것은 아니며 사이트에 따라 다릅니다. 다음 6자를 더한 "Gig"단어를 추출해야합니다. 나는 이것을하는 가장 좋은 방법이 무엇인지 전혀 모른다.

나는 초보자이지만 perl이지만 노력하고 있습니다. 감사합니다

+0

"정규 표현식"을 찾으십시오. –

답변

1
# "I need to extract the word "Gig" plus the next 6 characters." 
# This looks like a fixed-with file format, so consider using unpack. 
foreach (@lines) { 
    my($orem, $gig, $rest) = unpack 'a17 a9 a*'; 
    print "[$gig]\n"; 
} 

는 형식으로, 당신은 파일 스펙이 무엇인지 알아낼 필요하고 어쩌면 무언가 같이, 정규 표현식을 사용

my($orem, $gig, $rest) = m/(\S+)\s+(.{9})(.*)/; 

그러나이 의지 적절한 파일 스펙이없는 일반적인 경우에는 작동하지 않습니다.

+0

쓸데없는 일 (방법 1)없이 : my $ gig = unpack 'x17 a9'; ' – ikegami

+0

불필요한 작업 (방법 2)없이 : my ($ gig) =/^ \ S + \ s + (\ S + \ s + \ S +)/s; ' – ikegami

+0

너비가 고정되어 있지 않습니다. – Matt

1

그런 것들은 Perl을 위해 만들어진 것입니다. 정규 표현식을 사용하는 것이 좋습니다. perldoc perlre을 읽으십시오. 그것은 고정하지 않다면

foreach $ints (@array) { 
    $ints =~ s/(Gig.{6})/$1/g; 
} 
+0

고마워, 나는 그것을 읽을 것이다. 나는 다소 멍청하다. 이제 모든 사람들이 파이썬을 사용하라고 말하고있다. – Matt

+0

아, 파이썬이 좋다. Perl도 좋습니다. 각 언어마다 고유 한 장점이 있습니다. – Konerak

1

두 번째 및 세 번째 필드가 필요합니다.

my @array = map { /^\S+\s+(\S+\s\S+)/s } @source; 
0

이 사람은 이케 가미의 같은,하지만 난 당신이 보이는 방법을 뭔가 알고있는 경우, 모든 수단에 의해, 지정하는 것이 좋습니다. 이 작업은 목록 컨텍스트에서 수행되므로 사양과 일치하지 않는 문자열은 빈 목록을 반환하거나 무시됩니다.

my @results = map { m!(\bGig\s+\d+/d+)! } @array;