Автор Тема: Занесение переменной в массив - только числовая часть, почему?  (Прочитано 5444 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Люди помогите вычленить ошибку в коде


sub port_selection 
{


open (SERVICES"/etc/services");
while (
$line=<SERVICES>) {
 
$comment = \'#\';
 if($line=~/^$comment/g) {
#    print "Коментарий\\n";
 }
 else {
 chomp $line;

 my @other;
 my ($ot,$port_name);
 ($port_name,$port_num,@other)= split(/[/\\s/\\t]+/,$line);
 
 ($port_num,$ot)=split("/",$port_num);
 my $add_arr=\'add\';
 foreach $exist_port (@port_arr) {
  ($exist_port,$ot)=split("-",$exist_port);
  if ($exist_port == $port_num) {
   $add_arr=\'no\';
  }
 }
 if ($add_arr eq \'add\') {
  my $line_arr;
   $line_arr = "$port_num/\\-$port_name ";
  push @port_arr,$line_arr;
 }
 }
}
close(SERVICES);
}



В принципе все должно быть Ok, но увы(кусок вывода):
Цитировать

....
22273
22289
22321
22305
26208-wnn6_DS
root@server #

Как я понимаю, ошибка здесь:

if ($add_arr eq \'add\') {
  my $line_arr;
   $line_arr = "$port_num/\\-$port_name ";
  push @port_arr,$line_arr;
 }

... точнее в push, он почему-то вносит только первую часть $line_arr. Но почему?
P.S.: Где обратный слеш должен присутствовать я написал обычный - иначе не отображается на страничке
Всё будет хорошо - я договорился!

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
В
[/s/t]
в действительности обратные слеши - просто их форум не отображает. :(((
Всё будет хорошо - я договорился!

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
а что вы хотите сделать?

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Проблема, насколько я вижу здесь:

foreach $exist_port (@port_arr) {
  ($exist_port,$ot)=split("-",$exist_port);
  if ($exist_port == $port_num) {
   $add_arr=\'no\';
  }
}

ИМХO, вычурная конструкция для проверки уже существующих элементов.
« Последнее редактирование: 29 Ноября 2004, 19:46:52 от NeoNox »
The documentations is your friend

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Skif
use strict не помешал бы...
Дело не в push...


foreach $exist_port (@port_arr) {
([b]$exist_port[/b],$ot)=split("-",$exist_port);
...


$exist_port - как элемент массива @port_arr в функции foreach - никто не отменял...

P.S. Не успел... :(

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
NeoNox
Согласен, но это уже было сделано мной после всех мытарств для наглядности(моей, ибо начал в себе сомневаться).

Phoinix
@port_arr должен иметь вид:
1-tcpmux            
2-compressnet      
3-compressnet      
4-echo              
5-rje              
6-zip              
7-echo              
9-discard          
.....
Соответственно элемент массива $exist_port будет, к примеру, 4-echo и split-ом  я получаю только цифровую(первую) часть, без введения еще одной переменной.
Приписку не понял...\\\\
Всё будет хорошо - я договорился!

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
может стоит принтовать каждую переменную, в цикле, где ошибка по вашим подозрениям? :)
я так и делала.. :) например
Цитировать
Skif:
if ($add_arr eq \'add\') {
  my $line_arr;
   $line_arr = "$port_num/-$port_name ";
print "\\$line_arr = $line_arr\\n";
  push @port_arr,$line_arr;
}

ну, "для наглядности".
пока-пока. :)

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Нет, здесь все в порядке - такую проверку я делал. Все равно тоже самое. Вот просто не пойму почему
print "$line_arr\\n";
Если быть более точным
Всё будет хорошо - я договорился!

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Поправлюсь -$line_arr имеет нормальный вид, а вот вноситься, как я уже и говорил, только числовая часть.
Всё будет хорошо - я договорился!

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Все, разобрался - без дополнительной переменной никак, иначе работая с $exist_port меняется значение не только переменной, но и ячейки массива...
Всё будет хорошо - я договорился!

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Skif AnnA

Еще раз. NeoNox же сказал где ошибка, а я еще добавил почему...

my @array = (\'1\', \'2\', \'3\', \'4\', \'5\');
foreach my $unit (@array) {
   $unit = \'1\';
}
print @array;

вывод:
11111

но никак не 12345, $unit - был, есть и будет элементом массива @array.
Строкой
($exist_port,$ot)=split("-",$exist_port);
ты указываешь новое значение текущему элементу массива.

Вообще согласен с NeoNox в том что это:
Цитировать
вычурная конструкция для проверки уже существующих элементов


А приписка, потому что дал точно такой же ответ что и NeoNox только на пару минут позже... ;)

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Угу, я это уже врубился. А вычурность - из-за наличия такой ошибки. Надо было проверить все от и до. Вот и проверял... ;)))
Всё будет хорошо - я договорился!

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Цитировать
Skif:
Все, разобрался

Phoinix
вы вообще любите после драки кулаками помахать, верно? :)
и еще. ;) всё хотела спросить - почему Phoinix?
такого слова нет в англ. языке afaik - Phoenix
« Последнее редактирование: 30 Ноября 2004, 13:09:15 от AnnA »
пока-пока. :)

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
AnnA
[OFF]Это просто кеш "любимого" IE
Извиняюсь за оффтоп.[/OFF]

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28