Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://www.sao.ru/cats/~satr/perl/perl_2.shtml
Дата изменения: Sat Jun 24 18:03:31 2000 Дата индексирования: Tue Oct 2 01:15:48 2012 Кодировка: koi8-r Поисковые слова: р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р р |
Perl-программы очень похожи на написанные на Cи/Cи++, возможно, потому, что сам язык был написан на Cи. Все Perl-программы состоят из операторов, имеющихся в файле и рассматриваемых в совокупности как одна большая программа, подлежащая выполнению. Но понятия «основной» (main) программы, как в языке Си, здесь нет. Комментарием в Perl является все, что следует за «решеткой» (#), вплоть до конца строки. Интерпретатор языка перед выполнением разбирает программу и компилирует в свой внутренний формат. Поэтому после ее запуска невозможно получить сообщение о синтаксической ошибке — это происходит только в процессе отладки программы в командной строке. В результате обеспечивается быстрое выполнение операций языка Perl после запуска.
Для написания программы можно использовать любой текстовый редактор. Так, в Windows это Notepad (Блокнот) или WordPad, в OS/2 — e или epm, в Unix — vi или emacs. Обычно лучшему пониманию языка способствует разбор небольшой программы (см. листинг 1). Листинг 1. Пример программы на Perl
#!/usr/local/bin/perl @passwords = qw (inet basic net); print ”Enter the login: ”; $login =; chomp ($login); if ($login eq ”Root”) { print ”Hello, Administrator! Glad to see you again!\n ”; } else { print ”Enter password: ”; $pass = ; chomp ($pass); $i = 0; $flag = ”no”; while ($flag eq ”no”) { if ($passwords[$i] eq $pass) { $flag = ”yes”; } elseif ($i <2) { $i = $i + 1; } else { print ”Incorrect password for $login, try again.\n”; print ”Enter password: ”; $pass = ; chomp ($pass); $i = 0; } } }
Интересной особенностью Perl является то, что программист не объявляет типы применяемых переменных. В первой строке описывается физический путь к выполняемому модулю интерпретатора (например, PERL.EXE), который должен начинаться со знака комментария (#):
#!/usr/local/bin/perl
В рассматриваемом случае массив @passwords включает три элемента: inet, basic, net. Команда qw(), заключающая их в скобки, освобождает от ввода кавычек, необходимого при использовании общепринятой конструкции вида
@passwords = (”inet”, ”basic”, ”net”);
Оператор print служит для вывода на экран символьной информации
print ”Enter the login: ”;
Приведенная ниже конструкция напоминает аналогичную по смыслу на языке Pascal:
print ”Enter the login: ”; $login =;
Следовательно, сначала располагается оператор вывода информации (print), а затем оператор ввода строки с терминала, выполняющегося в Perl с помощью считывающей одну строку данных конструкции Далее используется конструкция if-then-else:
Наличие значения переменной $pass среди элементов массива @passwords проверяет $passwords[$i] eq $pass.
Следующая ниже операция сложения
между кавычками помещается переменная $login, содержащая вводимое пользователем значение. В других языках программирования значения переменных обычно отделяются от данных. Например, в Basic эта строка будет иметь следующий вид:
Perl оперирует только двумя типами данных — скалярами и массивами, хотя в нем существует и такой тип, как ассоциативные массивы (хеши). Однако они являются некоторым специфичным подмножеством обычных.
Все числа и строки — это скалярные данные, или просто скаляры. Их названия начинаются со знака доллара (‘$’). Perl различает регистр символов, так, $Name и $name — две разные переменные. Числа, в отличие от строк, не нужно заключать в кавычки, например,
Аналогичный пример для строковых значений выглядит иначе (см. листинг 2).
Листинг 2
Для ввода скалярного значения используется дескриптор Массив — это список скаляров. Название переменных такого типа начинается с символа ‘@’. Каждый элемент массива — это отдельная скалярная переменная, которой можно присваивать значение и затем использовать ее независимо от других. Однако можно присвоить значение и всем элементам массива сразу, например
Проведя такую операцию, затем легко будет обращаться к каждому из скаляров с помощью индексных ссылок. В рассматриваемом примере $passwords[0] имеет значение inet, $passwords[1] — basic, а $passwords[2] — net. В качестве индекса может быть принято выражение, поэтому если присвоить $i значение 1 ($i = 1), то элементом массива $passwords[$i] будет basic. Поскольку каждый элемент массива — скаляр, при адресации ставится знак доллара, а не ‘@’. В отличие от других языков программирования, в массиве на Perl можно объединять скаляры разных типов данных. Если записать
Все массивы в языке — динамические. Не нужно беспокоиться о проблемах распределения памяти — интерпретатор все сделает за вас. Кроме того, массивы могут содержать подмассивы, поэтому можно создать подобную структуру:
Результирующий массив D будет содержать числовые значения от 1 до 9.
Большинство встроенных функций в Perl используют массивы как аргументы, например sort и join. Первая возвращает массив, но уже в отсортированном виде. Результатом операции
будет последовательность AlphaBetaGamma. Функция join имеет два входных параметра — строку и массив строк. Она возвращает строку, которая состоит из всех элементов массива, разделенных значением входной строки, т. е.
и выдает на печать Name : Address : Phone.
Может возникнуть вопрос, как добавить к уже существующему массиву какой-нибудь элемент, не создавая при этом дополнительный массив. Так, массив @letters содержит элементы Beta, Gamma и Alpha. Если в него нужно добавить значение Tetta, то следует использовать возможности функции push (см. листинг 3).
Листинг 3
Как ранее указывалось, дескриптор Ассоциативные массивы (АМ) упрощают работу программистов с БД. Эти массивы, так же как и обычные, представляют собой набор скалярных данных, отдельные элементы которого выбираются по индексному строковому значению. Элементы АМ не упорядочены, поэтому использовать их несколько сложнее, чем обычные, поскольку все строки (ключи) необходимо хранить вместе со значениями, на которые они ссылаются, например
В результате из-за структуры АМ «ключ, значение», получается «Banana». Ключом также является «Green», которому будет соответствовать элемент массива «Apple». Для лучшего понимания использования АМ следует сопоставить ключи с ID в таблицах реляционных баз данных, которые представляют собой практически одно и то же. Рассмотрим пример из листинга 4.
Листинг 4
Содержимое массивов можно представить и в другой форме, например
Индексы и элементы массива можно заключать как в апострофы, так и в кавычки. Чтобы перебрать все значения АМ, нужно использовать оператор foreach. Он предназначен для организации циклов, как и некоторые другие, в частности while. Можно обращаться к ключам и значениям с помощью операторов keys и values.
Специальный ассоциативный массив %ENV хранит содержимое всех переменных, индексированных по имени. Так, $ENV{‘PATH’} возвращает текущее значение пути поиска. Существует также функция each, приводящая список, который состоит из двух элементов — ключа и значения. При каждом следующем вызове она возвращает новую пару, к примеру
Назад |
Содержание |
Вперед
chomp ($login);
if ($login eq ”Root”) {
print ”Hello, Administrator! Glad to see you again!\n”;
} else {
...
}
$i = $i + 1;
увеличивает текущее значение счетчика на одну позицию.
В строке
print ”Incorrect password for $login, try again.\n”;
print ”Incorrect password for”; login$ ; ” try again.”
$a = 2;
$b = 6;
$c = $a . $b; # ”.” — операция конкатенации двух строк
$d = $c / 2;
print $d; # — результат равен 13
#!/usr/local/bin/perl -w # режим отображения
# предупреждений
# о возможности ошибок
$who = ‘Michael Yevdokimov’;
$where = ‘Moscow’;
$what = ‘in MSATU’;
print ”My name is $who,\n”; # представимся
print ”I live in $where,\n”,
”I study $what there.\n”; # где учимся
print ”\nSigned: \t$who,\n\t\t$where.\n”;
@passwords = qw(inet basic net);
@items = (20, ‘10.00’, ”диск”);
print ”Купи мне $items[0] $items[2]ет за \$$items[1].\n”;
то в результате получится текст «Купи мне 20 дискет за $10.00.»
@A = (1, 2, 3);
@B = (4, 5, 6);
@C = (7, 8, 9);
@D = (@A, @B, @C);
print sort (‘Beta’,’Gamma’,’Alpha’);
print join (‘:’,’Name’,’Address’,’Phone’);
@b = (”Beta”, ”Gamma”, ”Alpha”);
push @b, ”Tetta”; # добавим в массив @b новый элемент
@w = sort @b; # отсортируем массив @b по алфавиту
$c=0; # инициализируем переменную $c
foreach (@w) {
print ”$w[$c]\n”; # выведем отсортированные значения
$c++;
}
%fruit=(”Green”,”Apple”,”Orange”,”Orange”,”Yellow”,”Banana”);
print $fruit{”Yellow”};
%Folk = (‘BG’, ‘Bill Gates’,
‘MY’, ‘Michael Yevdokimov’,
‘BC’, ‘Bill Clinton’);
%State = (‘BG’, ‘California’,
‘MY’, ‘Moscow’,
‘BC’, ‘Washington’ );
%Job = (‘BG’, ‘work in Microsoft’,
‘MY’, ‘write this article’,
‘BC’, ‘work as the President of USA’);
foreach $person (‘MY’, ‘BG’, ‘BC’) {
print ”My name is $Folk{$person},\n”,
”I live in $State{$person},\n”,
”I $Job{$person} there.\n\n”;
}
%Job = (‘BG’ => ‘work in Microsoft’,
‘MY’ => ‘write this article’,
‘BC’ => ‘work as the President of USA’);
while (($key,$value) = each %ENV) {
print ”$key = $value\n”;
}