>[оверквотинг удален]
>> 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, # то же
""; # это, чтобы вывести последний перевод строки