Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поясните функции PUSH и POP,PLS, Курсовой горит ... PLEASE HELP !!!!!!!! 
:(
    Опции темы
Marriage
  Дата 5.12.2004, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 4.5.2004
Где: Таганрог

Репутация: нет
Всего: 2



Задали курсовую по СПО, достался вариант с PERL.
Я уже кое-что прочитал, но кое-чего не могу найти

Есть ли в Perl'е функции Chomp,pop,push...
Если есть , то что они делают. По POP и PUSH в принципе сказать могу, что это такое, но как это в перле используется . И если возможно, то примеру этих функций был бы просто рад.
ЗЫ
А что такое .= ???
Как в С или нет ???


PLEASE HELP !!!!!!!!!!!!!!!!!!!!!!



--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
Secandr
Дата 5.12.2004, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 1
Всего: 39



$a.='aa' это то же что $a=$a.'aa';
pop - вырезать первый элемент массива насполько помню
push - запихнуть список в массив (добавление элементов)
Chomp - кажется обрезание ентера на конце


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
dimes
Дата 5.12.2004, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 249
Регистрация: 20.7.2004
Где: то около СПБ

Репутация: нет
Всего: 14



Цитата(Secandr @ 5.12.2004, 15:33)
pop - вырезать первый элемент массива насполько помню

Нет, это shift так делает а pop последний вырезает


Цитата(Secandr @ 5.12.2004, 15:33)
Chomp - кажется обрезание ентера на конце

До но только chomp и режет последний '\n' в виндах перевод '\r\n'
PM ICQ   Вверх
korob2001
Дата 5.12.2004, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Цитата

Есть ли в Perl'е функции Chomp,pop,push...

Есть.

chomp - удаляет из конца переданной ей строки "терминатор", который в текущий момент установлен в переменной $/, по умолчанию, это символ перевода строки \n. В более ранних версиях Perl использовали chop, но он менее удобный, чем chomp, потому как удаляет любой символ с конца строки.
Пример:
Код

#!/usr/bin/perl -w
use strict;
print "Please enter your name: ";

#Получаем строку с терминала
my $name = <STDIN>;

# Выводим приветствие на терминал
print $name, ", hello!\n";

Например юзер ввел имя Вася. По идее мы хотели бы получить такую строку:
Вася, hello!
но на самом деле получим такой результат:
Вася
, hello!

Вся беда в том, что когда юзер ввёл имя он нажал клавишу ENTER, для передачи имени в программу, другими словами в программу было передано имя юзера за которым следует символ перевода строки \n. Вот тут нам и понадобится chomp. Так теперь будет выглядеть наш код:
Код

#!/usr/bin/perl -w
use strict;
print "Please enter your name: ";
my $name = <STDIN>;
chomp( $name );
print $name, ", hello!\n";

Теперь мы получим то, что хотели.
Но можно было бы записать и более компактно, например так:
Код

#!/usr/bin/perl -w
use strict;
print "Please enter your name: ";
chomp( my $name = <STDIN> );
print $name, ", hello!\n";

Хотя по большому счёту это не важно.

====================================================

pop - удаляет из массива последний элемент, точнее было бы сказать что не удаляет, а вырезает, потому как этот вырезанный элемент можно сохранить в переменной. Допустим у нас есть массив @names c именами, и мы хотим удалить последнее имя в массиве и вместо него вставить другое. Кстати обрати внимание на то, что в примере ниже так же используется и push:
Код

#!/usr/bin/perl -w
use strict;
# Изначально в массиве 3 элемента
my @names = qw( Vasya Kolya Olya );
# Удаляем последний элемент и сохраняем его в переменную
my $last_name = pop @names;
#Теперь в массиве 2 элемента Vasya Kolya, а в переменной строка "Olya"

# Теперь вставим в конец массива другое имя
push( @names, "Denis" );
# После этого в массиве 3 элемента Vasya Kolya Denis

# Выводим массив в STDOUT
print join(", ", @names), "\n";
# А теперь и переменную $last_name
print $last_name, "\n";

Из примера видно, что push, наоборот, вставляет список в конец массива. Заметь, СПИСОК. С помощью push, можно добавить несколько элементов в конец массива. Например так:
Код

push( @names, "Denis", "Svetlana", "Boris", "Andrey" );

В итоге в конце массива @names, добавится 4 элемента, в том порядке, в каком они написаны в push.

====================================================

Цитата

А что такое .= ???

Я не знаю C. Вобщем в Perl это краткая запись конкатенации. Например у нас есть переменная с именем пользоаптеля. И мы хотим к имени добавить строку ", hello!", как в примере выше. Для примера я воспользуюсь кодом, которым пытался пояснить что такое chomp:
Код

#!/usr/bin/perl -w
use strict;
print "Please enter your name: ";
my $name = <STDIN>;
chomp( $name );
# Обрати внимание на следующую конкатенацию строк
$name .= ", hello!";
print "$name\n";

Здесь была использована та конкатенация о которой ты спрашивал, она аналогична такой записи:
Код

$name = $name . ", hello!";

Только, краткий вариант будет работать быстрее, так как пременная $name вычисляется только 1 раз, а во втором варианте 2 раза.

Удачи.

Мля.... Пока писал у меня курица сгорела. smile((

Это сообщение отредактировал(а) korob2001 - 5.12.2004, 16:38


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Marriage
Дата 16.12.2004, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 4.5.2004
Где: Таганрог

Репутация: нет
Всего: 2



А еще такой вопрос :
Насколько правильн опонял из краткого курса, то объяления как в С или Паскале в Перле нет. ТАк вот, такой вопрос. Если был оператор :

$qwerty:=123;
.......................
А потом

$qwerty_second=Chomp($qwerty);

Ошибка при компиляции выскочит ???


my $last_name = pop @names;

Может

my $last_name = pop( @names);
???

И что такое "my"

????






Это сообщение отредактировал(а) Marriage - 16.12.2004, 14:47


--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
chaos
Дата 16.12.2004, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



Код

$qwerty:=123;
$qwerty_second=Chomp($qwerty);

В твоем случае будет ошибка компиляции тк $qwerty:=123; из-за :
Дальше chomp заметь не Chomp, функция возвращает общее кол-во символов, удаленных из всех переданных ей аргументов, а удаляет она с конца символы каторые совпадают с символами содержащимися в переменной $/. Вот тебе наглядный пример:
Код

$/ = "ab";
$a="123ab";
chomp $a;
print "\n$a";

В твоем примере должен быть 0. Это первое.

Второе:
Код

my $last_name = pop @names;
Может
my $last_name = pop( @names);

Можно со скобками можно без, как тебе нравится smile

Третье:
my - это как раз и есть интересующие тебя обявления, только без конкретизации типа как в С и паскале, и вообще my объявляет перечисленные переменные как локальные для текущего блока, пример :

Код

my $a = 2;

print $a;
aa;
print $a;

sub aa {
 my $a = 5;
}


Это сообщение отредактировал(а) chaos - 16.12.2004, 15:14
PM WWW   Вверх
chaos
Дата 17.12.2004, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



еще вопросы ???
PM WWW   Вверх
Marriage
Дата 19.12.2004, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 4.5.2004
Где: Таганрог

Репутация: нет
Всего: 2



Цитата

еще вопросы ???


ЕСть ...
Пример двумерного массива ...
Пример операторов


IF (полная форма с ELSE ), While и Unless ....
Оччень надо .... smile

Это сообщение отредактировал(а) Marriage - 19.12.2004, 01:24


--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
Secandr
Дата 19.12.2004, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 1
Всего: 39



Marriage А книжку посмотреть?
массив:
$a[1][2]=1;
хешь:
$b{'a'}{'b'}=2;

А что значит пример операторов?

if/unless (условие) {делать}elsif else{делать}
делать if/unless условие;

while (EXPR) {}

for ($i = 2; $i < 5; ++$i)
{
print $i;
}


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
cybear
Дата 19.12.2004, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.11.2004
Где: Tallinn, Estonia

Репутация: нет
Всего: нет



двумерных массивов нету - есть Array of Arrays - смотри man perllol - там очень все хорошо прописано, с примерами.
PM MAIL WWW ICQ MSN   Вверх
Marriage
Дата 19.12.2004, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 4.5.2004
Где: Таганрог

Репутация: нет
Всего: 2



Цитата

Marriage А книжку посмотреть?


Немае ... А покупать - денег лишних нет


--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
Marriage
Дата 21.12.2004, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 4.5.2004
Где: Таганрог

Репутация: нет
Всего: 2



People !!!
Кинте кто-нить исходникна перле большой (на пару печатных страниц), проверить лексический анализатор надо ... smile


--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
chaos
Дата 21.12.2004, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



Код

 #!/usr/bin/perl -w
 # fwdport -- act as proxy forwarder for dedicated services
 
 use strict;                 # require declarations
 use Getopt::Long;           # for option processing
 use Net::hostent;           # by-name interface for host info
 use IO::Socket;             # for creating server and client sockets
 use POSIX ":sys_wait_h";    # for reaping our dead children
 
 my (
     %Children,              # hash of outstanding child processes
     $REMOTE,                # whom we connect to on the outside
     $LOCAL,                 # where we listen to on the inside
     $SERVICE,               # our service name or port number
     $proxy_server,          # the socket we accept( ) from
     $ME,                    # basename of this program
 );
 
 ($ME = $0) =~ s,.*/,,;      # retain just basename of script name
 
 check_args( );               # processing switches
 start_proxy( );              # launch our own server
 service_clients( );          # wait for incoming
 die "NOT REACHED";          # you can't get here from there
 
 # process command line switches using the extended
 # version of the getopts library.
 sub check_args {
     GetOptions(
         "remote=s"    => \$REMOTE,
         "local=s"     => \$LOCAL,
         "service=s"   => \$SERVICE,
     ) or die << EOUSAGE;
     usage: $0 [ --remote host ] [ --local interface ] [ --service service ]  
 EOUSAGE
     die "Need remote"                   unless $REMOTE;
     die "Need local or service"         unless $LOCAL || $SERVICE;
 }
 
 # begin our server
 sub start_proxy {
     my @proxy_server_config = (
       Proto     => 'tcp',
       Reuse     => 1,
       Listen    => SOMAXCONN,
     );
     push @proxy_server_config, LocalPort => $SERVICE if $SERVICE;
     push @proxy_server_config, LocalAddr => $LOCAL   if $LOCAL;
     $proxy_server = IO::Socket::INET->new(@proxy_server_config)
                     or die "can't create proxy server: $@";
     print "[Proxy server on ", ($LOCAL || $SERVICE), " initialized.]\n";
 }
 
 sub service_clients {
     my (
         $local_client,              # someone internal wanting out
         $lc_info,                   # local client's name/port information
         $remote_server,             # the socket for escaping out
         @rs_config,                 # temp array for remote socket options
         $rs_info,                   # remote server's name/port information
         $kidpid,                    # spawned child for each connection
     );
 
     $SIG{CHLD} = \&REAPER;          # harvest the moribund
 
     accepting( );
 
     # an accepted connection here means someone inside wants out
     while ($local_client = $proxy_server->accept( )) {
         $lc_info = peerinfo($local_client);
         set_state("servicing local $lc_info");
         printf "[Connect from $lc_info]\n";
 
         @rs_config = (
             Proto     => 'tcp',
             PeerAddr  => $REMOTE,
         );
         push(@rs_config, PeerPort => $SERVICE) if $SERVICE;
 
         print "[Connecting to $REMOTE...";
         set_state("connecting to $REMOTE");                 # see below
         $remote_server = IO::Socket::INET->new(@rs_config)
                          or die "remote server: $@";
         print "done]\n";
 
         $rs_info = peerinfo($remote_server);
         set_state("connected to $rs_info");
 
         $kidpid = fork( );
         die "Cannot fork" unless defined $kidpid;
         if ($kidpid) {
             $Children{$kidpid} = time( );            # remember his start time
             close $remote_server;                   # no use to master
             close $local_client;                    # likewise
             next;                                   # go get another client
         }
 
         # at this point, we are the forked child process dedicated
         # to the incoming client.  but we want a twin to make i/o
         # easier.
 
         close $proxy_server;                        # no use to slave
 
         $kidpid = fork( );
         die "Cannot fork" unless defined $kidpid;
 
         # now each twin sits around and ferries lines of data.
         # see how simple the algorithm is when you can have
         # multiple threads of control?
 
         # this is the fork's parent, the master's child
         if ($kidpid) {              
             set_state("$rs_info --> $lc_info");
             select($local_client); $| = 1;
             print while <$remote_server>;
             kill('TERM', $kidpid);      # kill my twin cause we're done
             }
         # this is the fork's child, the master's grandchild
         else {                      
             set_state("$rs_info <-- $lc_info");
             select($remote_server); $| = 1;
             print while <$local_client>;
             kill('TERM', getppid( ));    # kill my twin cause we're done
         }
         exit;                           # whoever's still alive bites it
     } continue {
         accepting( );
     }
 }
 
 # helper function to produce a nice string in the form HOST:PORT
 sub peerinfo {
     my $sock = shift;
     my $hostinfo = gethostbyaddr($sock->peeraddr);
     return sprintf("%s:%s",
                     $hostinfo->name || $sock->peerhost,
                     $sock->peerport);
 }
 
 # reset our $0, which on some systems make "ps" report
 # something interesting: the string we set $0 to!
 sub set_state { $0 = "$ME [@_]" }
 
 # helper function to call set_state
 sub accepting {
     set_state("accepting proxy for " . ($REMOTE || $SERVICE));
 }
 
 # somebody just died.  keep harvesting the dead until
 # we run out of them.  check how long they ran.
 sub REAPER {
     my $child;
     my $start;
     while (($child = waitpid(-1,WNOHANG))> 0) {
         if ($start = $Children{$child}) {
             my $runtime = time( ) - $start;
             printf "Child $child ran %dm%ss\n",
                 $runtime / 60, $runtime % 60;
             delete $Children{$child};
         } else {
             print "Bizarre kid $child exited $?\n";
         }
     }
     # If I had to choose between System V and 4.2, I'd resign. --Peter Honeyman
     $SIG{CHLD} = \&REAPER;
 };



пойдет такое
PM WWW   Вверх
Marriage
Дата 21.12.2004, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 4.5.2004
Где: Таганрог

Репутация: нет
Всего: 2



chaos

Сенкс.


--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
chaos
Дата 22.12.2004, 06:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



ЗЫ
А что такое .= ???
Как в С или нет ???


чето не припоминаю такую операцию(точка) в с
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0784 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.