2014-12-11 4 views
2

Я новичок в Perl. Я пытаюсь извлечь информацию VLAN, хранящуюся в файле. Содержимое файла,Perl regex не может соответствовать концу строки

VLAN0001 
    Spanning tree enabled protocol rstp 

Interface   Role Sts Cost  Prio.Nbr Type 
------------------- ---- --- --------- -------- -------------------------------- 
PE8/1    Desg FWD 2   128.2945 P2p Edge 
Ta579    Desg FWD 3   128.5761 P2p Edge 

VLAN0023 
    Spanning tree enabled protocol rstp 

Interface   Role Sts Cost  Prio.Nbr Type 
------------------- ---- --- --------- -------- -------------------------------- 
PE8/1    Desg FWD 2   128.2945 P2p Edge 
Ta579    Desg FWD 3   128.5761 P2p Edge  

ACCOUNT 
    Spanning tree enabled protocol rstp 

Interface   Role Sts Cost  Prio.Nbr Type 
------------------- ---- --- --------- -------- -------------------------------- 
Ta579    Desg FWD 1   128.5764 P2p 

У меня есть PERL код как,

#!/usr/bin/perl 
use strict; 
use warnings; 
use Data::Dumper; 
my $filename = "spanning-tree1.txt"; 
    open my $fh, '<', $filename or die "error opening $filename: $!"; 
    my $data = do { local $/; <$fh> }; 

my @list = ($data =~ /(^[A-Za-z0-9]+.*?(?=^[A-Za-z0-9]+$|\Z))/msg); 
#print Dumper($data); 
#print "\n##############################################\n"; 
print Dumper(\@list); 

И его из пут,

$VAR1 = [ 
      'VLAN0001 
    Spanning tree enabled protocol rstp 

Interface   Role Sts Cost  Prio.Nbr Type 
------------------- ---- --- --------- -------- -------------------------------- 
PE8/1    Desg FWD 2   128.2945 P2p Edge 
Ta579    Desg FWD 3   128.5761 P2p Edge 

VLAN0023 
    Spanning tree enabled protocol rstp 

Interface   Role Sts Cost  Prio.Nbr Type 
------------------- ---- --- --------- -------- -------------------------------- 
PE8/1    Desg FWD 2   128.2945 P2p Edge 
Ta579    Desg FWD 3   128.5761 P2p Edge 

ACCOUNT 
    Spanning tree enabled protocol rstp 

Interface   Role Sts Cost  Prio.Nbr Type 
------------------- ---- --- --------- -------- -------------------------------- 
Ta579    Desg FWD 1   128.5764 P2p' 
     ]; 

мне нужен выход (@list), как,

$VAR1 = [ 
      'VLAN0001 
    Spanning tree enabled protocol rstp 

Interface   Role Sts Cost  Prio.Nbr Type 
------------------- ---- --- --------- -------- -------------------------------- 
PE8/1    Desg FWD 2   128.2945 P2p Edge 
Ta579    Desg FWD 3   128.5761 P2p Edge 

', 
      'VLAN0023 
    Spanning tree enabled protocol rstp 

Interface   Role Sts Cost  Prio.Nbr Type 
------------------- ---- --- --------- -------- -------------------------------- 
PE8/1    Desg FWD 2   128.2945 P2p Edge 
Ta579    Desg FWD 3   128.5761 P2p Edge 

', 
      'ACCOUNT 
    Spanning tree enabled protocol rstp 

Interface   Role Sts Cost  Prio.Nbr Type 
------------------- ---- --- --------- -------- -------------------------------- 
Ta579    Desg FWD 1   128.5764 P2p' 
     ]; 

Интересно, что я получаю правильные значения в @list, когда ввод задан как строка и не читается из файла.

+1

Благодаря обеспечить также ** ваш код perl ** –

+0

Каков ваш ожидаемый результат? – Toto

+0

Это не пусто, см .: http://ideone.com/KT4lJa –

ответ

2

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

my @list = split /(?= ^[A-Z0-9]+\s*$)/mx, do { local $/; <DATA> }; 
+0

Мы думали о том, чтобы делать это, но нет никаких гарантий этого состояния. – Netro

+0

Обновление @Netro проверки .. https://eval.in/233441 –

3

Иногда регулярное выражение не единственное решение:

#!/usr/bin/perl 
use strict; 
use warnings; 
use Data::Dumper; 

my $inc = -1; 
my @list; 

my $filename = "spanning-tree1.txt"; 
open my $fh, '<', $filename or die "error opening $filename: $!"; 

while (<$fh>) { 
    /^[A-Z0-9]+\s*$/ and $inc++; 
    $list[$inc] .= $_; 
} 
print Dumper(\@list); 
close $fh; 
+0

Привет, вы можете объяснить, почему чтение из файла не работает? – Netro

+0

Не знаю, что вы имеете в виду, сценарий читает файл, как ожидалось. Вы подтвердили имя файла? Есть ли какие-либо ошибки? –

+1

Файл имеет контрольные символы. Я удалил их, и код работает. Благодарю. – Netro

Смежные вопросы