Forum Webscript.Ru
Программирование => Perl => Тема начата: 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.: Где обратный слеш должен присутствовать я написал обычный - иначе не отображается на страничке
-
/[/s/t]+/ -- ?
-
В
[/s/t]
в действительности обратные слеши - просто их форум не отображает. :(((
-
а что вы хотите сделать?
-
Проблема, насколько я вижу здесь:
foreach $exist_port (@port_arr) {
($exist_port,$ot)=split("-",$exist_port);
if ($exist_port == $port_num) {
$add_arr=\'no\';
}
}
ИМХO, вычурная конструкция для проверки уже существующих элементов.
-
Skif
use strict не помешал бы...
Дело не в push...
foreach $exist_port (@port_arr) {
([b]$exist_port[/b],$ot)=split("-",$exist_port);
...
$exist_port - как элемент массива @port_arr в функции foreach - никто не отменял...
P.S. Не успел... :(
-
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-ом я получаю только цифровую(первую) часть, без введения еще одной переменной.
Приписку не понял...\\\\
-
может стоит принтовать каждую переменную, в цикле, где ошибка по вашим подозрениям? :)
я так и делала.. :) например
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;
}
ну, "для наглядности".
-
Нет, здесь все в порядке - такую проверку я делал. Все равно тоже самое. Вот просто не пойму почему
print "$line_arr\\n";
Если быть более точным
-
Поправлюсь -$line_arr имеет нормальный вид, а вот вноситься, как я уже и говорил, только числовая часть.
-
Все, разобрался - без дополнительной переменной никак, иначе работая с $exist_port меняется значение не только переменной, но и ячейки массива...
-
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:
Все, разобрался
Phoinix
вы вообще любите после драки кулаками помахать, верно? :)
и еще. ;) всё хотела спросить - почему Phoinix?
такого слова нет в англ. языке afaik - Phoenix
-
AnnA
[OFF]Это просто кеш "любимого" IE
Извиняюсь за оффтоп.[/OFF]