URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1650
[ Назад ]

Исходное сообщение
"Исскуство програмирования"

Отправлено vova , 29-Апр-03 07:13 
Приветствую всех.
Написал такой скрипт: (может гдето коряво, не судите строго, только учусь)

#!/usr/bin/perl

$in_passwd = "/etc/passwd";
$in_alias = "/etc/mail/test_alias.txt";

open (PASSWD,"$in_passwd") or die "Can't open passwd file. $!.";
open (ALIAS,"$in_alias") or die "Can't open passwd file. $!.";

while (defined($alias=<ALIAS>)) {
              chomp ($alias);
              while (defined($passwd=<PASSWD>)) {
                  ($user,$d,$d,$d,$comment,$d,$d) = split(/:/,$passwd);
              chomp ($user);
                      $comment =~ tr/жюгсоьазвуйнрыэехпидлтчфмбцъБВЧЗДЕЦЪЙКЛМНОПРТУФХЖИГЮЫЭЯЩШЬАС/ФЧЦЯНЭЮГБСИМПШЩЕУОХДКРВТЛАЖЗабвгдежзийклмнопрстуфхцчшщъыьэюя/;
                  if ($alias eq $user) {
                        print "$comment\n";
                       last;
                   }
              }
}

close (ALIAS);
close (PASSWD);

скрипт сравнивает файлы passwd test_alias.txt на наличие одинаковых учетных записей.
Проблема вот в чем: когда происходит вызод из внутреннего циска по last, то при в ходе в него проверка начинается не с первой строки файла passwd
а со следующей от той, с которой был осуществлен выход, а надо что бы с первой. Как это сделать не подскажите ?

Заранее спасибо всем.


Содержание

Сообщения в этом обсуждении
"Исскуство програмирования"
Отправлено vova , 29-Апр-03 07:17 
>скрипт сравнивает файлы passwd test_alias.txt на наличие одинаковых учетных записей.
>Проблема вот в чем: когда происходит вызод из внутреннего циска по last,

извиняюсь за ошибки

"выход из внутреннего цикла"


"Исскуство програмирования"
Отправлено Parish , 29-Апр-03 15:30 
Проще будет если вначале "/etc/mail/test_alias.txt" считать в хеш, а потом проверять defined($Alias{$user})

"Исскуство програмирования"
Отправлено XMan , 29-Апр-03 17:45 
А чего ты хотел ? Спорим, у тебя то же самое будет и в любом другом языке ? :)
Либо закрывай файл и открывай снова, либо (что несомненно лучше) делай seek в начало :)

"Исскуство програмирования"
Отправлено vova , 30-Апр-03 06:09 
>А чего ты хотел ? Спорим, у тебя то же самое будет
>и в любом другом языке ? :)
>Либо закрывай файл и открывай снова, либо (что несомненно лучше) делай seek
>в начало :)

т.е. закрывать passwd сразу после last и открывать перед внутренним циклом ?

а что такое seek ?



"Исскуство програмирования"
Отправлено vova , 30-Апр-03 07:13 
>а что такое seek ?

нашел. и вот что получилось в итоге:

#!/usr/bin/perl

$in_passwd = "/etc/passwd";
$in_alias = "/etc/mail/test_alias.txt";

open (PASSWD,"$in_passwd") or die "Can't open passwd file. $!.";
open (ALIAS,"$in_alias") or die "Can't open passwd file. $!.";

while (defined($alias=<ALIAS>)) {
              chomp ($alias);
        #      open (PASSWD,"$in_passwd") or die "Can't open passwd file. $!.";
              while (defined($passwd=<PASSWD>)) {
                  ($user,$d,$d,$d,$comment,$d,$d) = split(/:/,$passwd);
              chomp ($user);
                      $comment =~ tr/жюгсоьазвуйнрыэехпидлтчфмбцъБВЧЗДЕЦЪЙКЛМНОПРТУФХЖИГЮЫЭЯЩШЬАС/ФЧЦЯНЭЮГБСИМПШЩЕУОХДКРВТЛАЖЗабвгдежзийклмнопрстуфхцчшщъыьэюя/;
                  if ($alias eq $user) {
                        print "$comment\n";
#                                close (PASSWD);
                               seek (PASSWD,0,0);
                       last;
                   }
              }
}

close (ALIAS);
close (PASSWD);

вроде работает как надо. Однако может что то неверно ?



"Исскуство програмирования"
Отправлено Parish , 30-Апр-03 15:08 
>вроде работает как надо. Однако может что то неверно ?
имхо алгоритм


"Исскуство програмирования"
Отправлено vova , 04-Май-03 06:44 
>>вроде работает как надо. Однако может что то неверно ?
>имхо алгоритм

а как правильно сделать ?



"Исскуство програмирования"
Отправлено XMan , 05-Май-03 00:11 
Parish тебе уже сказал:

Проще будет если вначале "/etc/mail/test_alias.txt" считать в хеш, а потом проверять defined($Alias{$user})


:)


"Исскуство програмирования"
Отправлено vova , 05-Май-03 05:45 
>Parish тебе уже сказал:
>
>Проще будет если вначале "/etc/mail/test_alias.txt" считать в хеш, а потом проверять defined($Alias{$user})
>
>
>
>:)


ясно. буду пробовать сделать как положено
спасибо всем большое за помощь :))