2013-12-03 3 views
0

Я только недавно задал здесь вопрос о чтении из файла и разбиении каждой строки, которая может быть найдена here.Ввод первой строки без пробела

Теперь у меня есть другой вопрос. Как сделать ввод чтения прочитанным, пока не будет найден символ пробела/табуляции/пробела?

Вот код:

#!/usr/bin/perl 
open (ReadFrom, 'data.txt'); 
open (WriteTo, '>>data2.txt'); 
while (<ReadFrom>) { 
chomp; 
($hop, $skipme, $ip, $time1) = split(/ /); 
print WriteTo "Hop: $hop\n"; 
print WriteTo "IP: $ip\n"; 
print WriteTo "Time: $time1\n"; 
} 
close (ReadFrom); 
exit; 

Вот входной файл, например: http://i.imgur.com/QA7dyKz.png

Как вы можете заметить, между номерами 1 и 9, есть пробел перед номером, это, по-видимому, считается расщеплением, и эти числа используются как значения skipme, а не значения hop. Остальные (10+) работают нормально, поскольку перед номером нет места. То, что я собираюсь выяснить, - это игнорировать каждый символ пробела, пока не найдет символ без пробелов. И тогда начнется раскалывание или что-то еще.

Это выход я с этим текущим кодом:

Hop: traceroute 
IP: www.totalnet.com.ar 
Time: (200.123.156.209), 
Hop: 
IP: 
Time: www.undisclosed.com 
Hop: 
IP: 
Time: www.undisclosed.com 
Hop: 
IP: 
Time: www.undisclosed.com 
Hop: 
IP: 
Time: www.undisclosed.com 
Hop: 
IP: 
Time: www.undisclosed.com 
Hop: 
IP: 
Time: ae1x19.wsu5.mich.net 
Hop: 
IP: 
Time: xe-4-1-1x76.eq-chi2.mich.net 
Hop: 
IP: 
Time: ae-4.584.chic0.tr-cps.internet2.edu 
Hop: 
IP: 
Time: xe-2-2-0.0.ny0.tr-cps.internet2.edu 
Hop: 10 
IP: 64.57.20.74 
Time: (64.57.20.74) 
Hop: 11 
IP: NSS-S-A.TenGigabitEthernet8-3.ar1.EZE1.gblx.net 
Time: (64.208.7.70) 
Hop: 12 
IP: customer-static-210-110-65.iplannetworks.net 
Time: (190.210.110.65) 
Hop: 13 
IP: customer-static-210-110-54.iplannetworks.net 
Time: (190.210.110.54) 
Hop: 14 
IP: customer-static-210-110-141.iplannetworks.net 
Time: (190.210.110.141) 
Hop: 15 
IP: 190.210.125.85 
Time: (190.210.125.85) 
Hop: 16 
IP: mx.radioelectron.com.ar 
Time: (200.123.156.209) 
+1

Вы получаете это поведение, потому что вы разделяете регулярное выражение с пространством '/ /', а не буквальное пространство '' '', которое почти похоже на '/ \ s + /', за исключением того, что оно разбивает ведущие пробелы. – TLP

+1

Кроме того, такой ввод не всегда подходит для синтаксического анализа. С другой стороны, часто работает модуль, который выполняет эту работу. Я нашел это, например: ['Net :: Traceroute'] (http://search.cpan.org/perldoc?Net%3A%3ATraceroute). – TLP

+0

Это мелочи, которые мне нужно будет узнать и узнать больше, когда я получу время. Однако на данный момент я спешу с чем-то и продолжаю приходить сюда. Я очень ценю вашу помощь TLP, она работает. Надеюсь, это последний из вас, кто беспокоит вас, ребята, с ультра-простыми вопросами (я совершенно не знаком с perl, но очень опытен с программированием). И да, я видел, что есть модуль, но мы увидим, что это может быть лучшим вариантом, но мы уже собрали сотни результатов traceroute и ping, мне просто нужен скрипт, чтобы получить индивидуальный анализ среди всех. – Evan

ответ

1

проводка комментарий как ответ на запрос.

Вы получаете это поведение, потому что вы разбиваете на регулярное выражение с пространством / / и не буквальное пространства ' ', который почти как /\s+/, за исключением того, что он удаляет ведущие пробелы.

Кроме того, такой ввод не всегда подходит для синтаксического анализа. С другой стороны, часто работает модуль, который выполняет эту работу. Я нашел это, например: Net::Traceroute.

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