Forum Webscript.Ru

Программирование => Perl => Тема начата: Skif от 29 Ноября 2004, 17:56:42

Название: Занесение переменной в массив - только числовая часть, почему?
Отправлено: Skif от 29 Ноября 2004, 17:56:42
Люди помогите вычленить ошибку в коде


sub port_selection {


open (SERVICES, "/etc/services");
while ($line=) {
 $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 от 29 Ноября 2004, 18:23:45
/[/s/t]+/ -- ?
Название: Занесение переменной в массив - только числовая часть, почему?
Отправлено: Skif от 29 Ноября 2004, 18:34:23
В
[/s/t]
в действительности обратные слеши - просто их форум не отображает. :(((
Название: Занесение переменной в массив - только числовая часть, почему?
Отправлено: arto от 29 Ноября 2004, 19:17:34
а что вы хотите сделать?
Название: Занесение переменной в массив - только числовая часть, почему?
Отправлено: NeoNox от 29 Ноября 2004, 19:32:11
Проблема, насколько я вижу здесь:

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

ИМХO, вычурная конструкция для проверки уже существующих элементов.
Название: Занесение переменной в массив - только числовая часть, почему?
Отправлено: Phoinix от 29 Ноября 2004, 19:37:02
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 от 30 Ноября 2004, 10:06:29
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 от 30 Ноября 2004, 11:32:12
может стоит принтовать каждую переменную, в цикле, где ошибка по вашим подозрениям? :)
я так и делала.. :) например
Цитировать
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 от 30 Ноября 2004, 11:56:20
Нет, здесь все в порядке - такую проверку я делал. Все равно тоже самое. Вот просто не пойму почему
print "$line_arr\\n";
Если быть более точным
Название: Занесение переменной в массив - только числовая часть, почему?
Отправлено: Skif от 30 Ноября 2004, 12:00:24
Поправлюсь -$line_arr имеет нормальный вид, а вот вноситься, как я уже и говорил, только числовая часть.
Название: Занесение переменной в массив - только числовая часть, почему?
Отправлено: Skif от 30 Ноября 2004, 12:20:22
Все, разобрался - без дополнительной переменной никак, иначе работая с $exist_port меняется значение не только переменной, но и ячейки массива...
Название: Занесение переменной в массив - только числовая часть, почему?
Отправлено: Phoinix от 30 Ноября 2004, 12:29:37
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 от 30 Ноября 2004, 12:59:42
Угу, я это уже врубился. А вычурность - из-за наличия такой ошибки. Надо было проверить все от и до. Вот и проверял... ;)))
Название: Занесение переменной в массив - только числовая часть, почему?
Отправлено: AnnA от 30 Ноября 2004, 13:04:11
Цитировать
Skif:
Все, разобрался

Phoinix
вы вообще любите после драки кулаками помахать, верно? :)
и еще. ;) всё хотела спросить - почему Phoinix?
такого слова нет в англ. языке afaik - Phoenix
Название: Занесение переменной в массив - только числовая часть, почему?
Отправлено: Phoinix от 30 Ноября 2004, 16:12:46
AnnA
[OFF]Это просто кеш "любимого" IE
Извиняюсь за оффтоп.[/OFF]