The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"perl подстроки"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Perl)
Изначальное сообщение [ Отслеживать ]

"perl подстроки"  –1 +/
Сообщение от merfi (ok) on 21-Ноя-12, 11:55 
текстовый файл f.txt содержит ip адреса
192.168.100.120
172.31.25.12
Надо получить 2 массива
1 - содержит ip адреса
2 - содержит последние октеты ip адресов

С первым массивом все понятно
open(FILE,f.txt)
while(<FILE>){
   my ip_addr = $_;
}
print "@my_ipaddr\n" ;

А вот как собрать массив 2 не понятно
Думаю надо читать строку с конца до символа точка
Подскажите плиз ! Я в Perl полный 0.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "perl подстроки"  +/
Сообщение от Andrey Mitrofanov on 21-Ноя-12, 12:45 
>собрать массив 2 не понятно
> Думаю надо читать строку с конца

{
Начни с чтения какой ни то книжки про програмлянию. Для начала 10 подходов ао 2 часа. Много думать -- обязательно!

Потом попробуй, следующие 10 подходов!, применить полученные к своему "читать строку с конца".

} Lather, rinse, repeat ()

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "perl подстроки"  +/
Сообщение от merfi (ok) on 21-Ноя-12, 15:22 
>>собрать массив 2 не понятно
>> Думаю надо читать строку с конца
> {
> Начни с чтения какой ни то книжки про програмлянию. Для начала 10
> подходов ао 2 часа. Много думать -- обязательно!
> Потом попробуй, следующие 10 подходов!, применить полученные к своему "читать строку с
> конца".
> } Lather, rinse, repeat ()

А может вот так
#!/usr/bin/perl -w
open(FILE,"f.txt");
while(<FILE>)
{
  chomp;
  my @ip_addr = $_;
  print "@ip_addr\n" ;
foreach $arg (@ip_addr)
{
      $x = rindex($arg,".");
   my @ip_oktet = substr($arg,$x+1) ;
       print "@ip_oktet\n" ;
}

}
close(FILE);

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "perl подстроки"  +/
Сообщение от XAnder (ok) on 22-Ноя-12, 16:37 
>> Начни с чтения какой ни то книжки про програмлянию. Для начала 10
>> подходов ао 2 часа. Много думать -- обязательно!
> А может вот так
> ...

Книжки всё-таки надо почитать. И думать, да. А потом уже кодить. Но тут-то делать особо нечего:

$ cat > ips
192.168.100.120
172.31.25.12
$ cat ips | perl -e 'while (<>) {chomp; push @ips, $_; s/.*\.//; push @last, $_;} $,="\n"; print "= ips =", @ips, "= last =", @last, "";'
= ips =
192.168.100.120
172.31.25.12
= last =
120
12
$ _

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "perl подстроки"  +/
Сообщение от merfi (ok) on 26-Ноя-12, 10:09 
>[оверквотинг удален]
> $ cat ips | perl -e 'while (<>) {chomp; push @ips, $_;
> s/.*\.//; push @last, $_;} $,="\n"; print "= ips =", @ips, "=
> last =", @last, "";'
> = ips =
> 192.168.100.120
> 172.31.25.12
> = last =
> 120
> 12
> $ _

Согласен ! Так красивее и непонятнее

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "perl подстроки"  +/
Сообщение от XAnder (ok) on 26-Ноя-12, 11:52 
>[оверквотинг удален]
>> s/.*\.//; push @last, $_;} $,="\n"; print "= ips =", @ips, "=
>> last =", @last, "";'
>> = ips =
>> 192.168.100.120
>> 172.31.25.12
>> = last =
>> 120
>> 12
>> $ _
> Согласен ! Так красивее и непонятнее

Ну да, разумеется конструкции с rindex, substr и особенно print "@ip_addr\n" - это очень понятно и грамотно. Это сарказм, простите.

По существу же в вашем коде присутствуют фундаментальные ошибки:

my @ip_addr = $_;

Тут вы, вероятно, хотите поместить значение в массив. На самом же деле вы на каждой итерации создаёте новый массив из одного (!) элемента. Именно из-за этого следующая строка выдаёт ожидаемый результат:

print "@ip_addr\n" ;

Массив разворачивается в строку и выводится с переводом строки в конце. Но у вас цикл, а значит выводить на каждой итерации нужно не весь массив а отдельный элемент. Но, как замечено выше, у вас в массиве всегда только один элемент. Одна ошибка наложилась на другую, и чудесным образом получился нужный результат!

foreach $arg (@ip_addr)

Вложенный цикл вообще непонятно зачем нужен. Во-первых, тело его всегда будет выполнено ровно один раз. Во-вторых, именно это вам и надо - один раз взять последний октет.

   $x = rindex($arg,".");
   my @ip_oktet = substr($arg,$x+1) ;

А между тем есть замечательный механизм регулярных выражений, которым это действие выполняется проще и понятнее. И, опять же, массив здесь используется не к месту, как и выше.

В итоге задача не решена - хотя и получен внешне правильный вывод, но массивы-то не заполнены.

Теперь к "красивому и непонятному". Писалось в строку, чтобы не плодить лишних файлов. Пожертвуем "красотой" и прокомментируем:


while (<>) {       # читаем стандартный ввод, пока там что-то есть
   chomp;          # обрезаем перевод строки
   push @ips, $_;  # помещаем прочитанный адрес в массив @ips
   s/.*\.//;       # удаляем всё, кроме последнего октета
   push @last, $_; # а его помещаем в массив @last
}
$, = "\n";     # выводить будем каждую строку с новой строки
print
   "= ips =",
   @ips,       # массив будет развёрнут в список и выведен поэлементно
   "= last =",
   @last,      # то же
   "";         # это, чтобы вывести последний перевод строки

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру