Часть III. Программирование на Perl
Глава 13. Стандартные модули
Коротко
В этой главе мы вкратце познакомимся с возможностями, предоставляемыми многочисленными модулями Perl. Модуль Perl состоит из кода, который написан в соответствие с определенными требованиями. Функции, содержащиеся в модулях, можно использовать в любой программе.
Использование модулей Perl
О правилах написания модулей Perl рассказывается в главе 15. Сейчас наиболее существенно то, что они предоставляют в распоряжение разработчика огромный объем уже написанного и выполняющего множество полезных функций кода. Модули находятся в файлах с расширением .pm и могут загружаться в программу с помощью команды use:
use модуль список
use модуль
use модуль ()
use модуль версия список
use модуль версия
use модуль версия ()
use версия
Если задано имя модуля и за ним следует список функций, то загружаются указанные функции. Если список не указан, загружаются все функции модуля. Наконец, если указан пустой список, то ни одна функция не загружается, хотя имена функций и переменных, указанные в модуле, становятся известны программе.
Если после имени модуля (или между именем модуля и списком функций) находится число, то перед загрузкой модуля проверяется его текущая версия (если в модуле предусмотрен номер версии). Если версия модуля, установленного в вашей системе, младше версии, указанной в команде use, интерпретатор прерывает работу с выдачей сообщения об ошибке.
Наконец, если первый переданный команде параметр — число, то Perl проверяет текущую версию интерпретатора. Если она меньше заданного числа, то интерпретатор прекращает работу с выдачей сообщения об ошибке.
Вот пример, в котором мы загружаем все функции из модуля Safe:
use Safe;
$safecompartment = new Safe;
$safecompartment->permit(qw(print));
$result = $safecompartment->reval("print \"Hello!\";");
Hello!
А вот так из модуля POSIX загружается только функция strtime:
use POSIX 'strftime';
print strftime "Here is the date: %d/%m/%Y\n", localtime
Here is the date: 30/10/1999
Подсказка . Наиболее простой способ преобразовать список имен функций в список строк — это заключить их в псевдокавычки qw/.../ (см. табл. 2.3 в главе 2). То есть конструкция use POSIX qw/strftime asctime/ эквивалентна конструкции use POSIX ('strftime', 'asctime') (обратите внимание на отсутствие запятых внутри конструкции qw/.../).
Иногда для составных имен, включающих имя пакета и имя модуля, также приходится использовать разделитель :: (то есть когда требуется подмодуль модуля). Например, в следующем случае мы используем подмодуль Copy модуля File, чтобы скопировать файл под новым именем:
use File::Copy;
copy ("file.txt", "file2.txt");
Подсказка. Perl заменяет разделитель :: на /, так что имя File::Copy, то есть File/Copy, означает, что мы ищем файл Copy.pm в подкаталоге File каталога библиотеки модулей.
Кроме загрузки модулей команда use обрабатывает также прагмы, то есть специальные директивы для компилятора Perl. Мы уже встречались с некоторыми из них, — например, если вы поместите команду use strict 'vars' в программу, Perl будет требовать объявления всех глобальных переменных.
В Perl имеется множество стандартных модулей, и мы собираемся сделать в этой главе краткий обзор наиболее популярных. Сколько модулей включается в поставку Perl? Взгляните на табл. 13.1.
Помимо основных модулей Perl, перечисленных в табл. 13.1, в данном разделе приводится список основных прагм, обобщенных в табл. 13.2. Имена прагм используют строчные буквы, тогда как имена модулей начинаются с заглавной буквы.
Кроме стандартных модулей, поставляемых с Perl, множество дополнительных модулей можно получить через CPAN и другие архивы (например, узел компании ActiveState). Эти модули охватывают полный диапазон задач от сетевых операций до работы с интерфейсными библиотеками типа Tk. Вы можете скопировать и установить эти модули самостоятельно или же использовать инструмент, подобный Perl Package Manager (PPM), — то есть готовый сценарий Perl для ус
Использование модулей Perl
тановки пакетов1 (он входит в состав пакета ActivePerl). Вот, к примеру, какие команды вы можете использовать с PPM после соединения с Интернетом:
· help — вывести справку,
· install пакеты — загрузить и установить указанные пакеты,
· query — получить информацию об установленных пакетах,
· quit — выход из PPM,
· remove пакеты — удаляет указанные пакеты,
· search — получить информацию о доступных (для загрузки и установки) пакетах,
· set — задать и отобразить текущие установки,
· verify — проверить, соответствуют ли установленные пакеты самой последней версии.
Например, чтобы загрузить и установить популярный модуль Tk, надо соединить ся с Интернетом, запустить PPM, а затем ввести команду «install Tk». Эта процедура сильно упрощает процесс, хотя о проблемах, связанных с PPM, в посвященных Perl конференциях UseNet идут бесконечные споры.
Модуль Tk поддерживает вызов процедур библиотеки Tk из Perl и позволяет использовать в программах визуальный графический интерфейс. Так как этот модуль стал столь популярен среди программистов на Perl, мы рассмотрим его чуть более подробно (хотя он и не входит в стандартную библиотеку модулей), продемонстрировав несколько примеров, как отобразить окно с кнопками, кнопками с зависимой фиксацией (radiobuttons) и кнопками с независимой фиксацией (checkbox), меню, списками и другими интерфейсными элементами графической библиотеки Tk. (Обратите внимание, что интерфейсные элементы библиотеки Tk могут выглядеть по-разному в различных операционных системах.)
На этом закончим с введением. Теперь мы готовы приступить к обзору модулей Perl.
Таблица 13.1. Стандартные модули Perl
Модуль Предназначение
AnyDBM_File Среда для различных баз данных DBM
AutoLoader Загрузка функций по требованию
AutoSplit Разбивка пакета для облегчения
режима
автозагрузки (autoloading)
Benchmark Тесты скорости кода на этапе
выполнения
CPAN Интерфейс к архиву CPAN
(Comprehensive Perl Archive
Network)
CPAN::FirstTime Создает конфигурационный файл CPAN
продолжение И
1 В Unix для установки модулей обычно используется модуль CPAN. — Примеч. ред.
Таблица 13.1 (продолжение )
Модуль Предназначение
CPAN::Nox Запуск модулей CPAN без
использования
cкомпилированных файлов
(отбор по
расширению файла)
Carp Предупреждения об ошибках
Class::Struct Создание структурных типов
данных,
подобных данным языка С
Config Информация о конфигурации Perl
Cwd Путь, соответствующий текущему
(рабочему) каталогу
DB_File Операции с базами данных DBM
формата Berkley DB
Devel::SelfStubber Создание заглушек для модулей
с
режимом автозагрузки
DirHandle Методы работы с дескрипторами каталогов
DynaLoader Загрузка библиотек языка С
English Использование английских имен для
специальных
переменных Perl
Env Доступ к значениям переменных среды
Exporter Метод импортирования модулей,
используемый по
умолчанию
ExtUtils::Embed Внедрение Perl в приложения,
написанные
на C/C++
ExtUtils::Install Установка файлов
ExtUtils::Liblist Получение библиотек для
их
использования
ExtUtils::MM_OS2 Замена поведения
модуля
ExtUtils::MakeMaker, типичного для
Unix, на
поведение, типичное для OS/2
ExtUtils::MM_Unix Устанавливает поведение
модуля
ExtUtils::MakeMaker, типичное для Unix
ExtUtils::MM_VMS Замена поведения
модуля
ExtUtils::MakeMaker, типичного для
Unix, на
поведение, типичное для VMS
ExtUtils::MakeMaker Создание расширенного makefile
ExtUtils::Manifest Запись файла с описанием пакета
ExtUtils::Mkbootstrap Создание файла
автозагрузки,
используемого модулем DynaLoader
ExtUtils::Mksymlists Запись файла с параметрами работы
для
редактора связей
ExtUtils::testlib Добавляет каталоги к переменной @INC
Fatal Ошибки считаются критическими
Fcntl Загрузка заголовочного файла языка
С
Fcntl.h, содержащего символические
имена для
констант, используемых
функциями Perl
Использование модулей Perl
Модуль Предназначение
File::Basename Синтаксический разбор полного имени
файла
File::CheckTree Тестирование файлов по полному
дереву
каталогов
File::Compare Сравнение файлов
File::Copy Копирование файлов
File::Find Поиск файлов по полному дереву
каталогов
File::Path Создание и удаление каталогов
File::stat Интерфейс для функций stat()
FileCache Позволяет одновременно открыть
больше файлов
FileHandle Методы для работы с дескрипторами
файлов
FindBin Поиск каталога, где находится сценарий
Perl
GDBM_File Функции и классы для работы с базами
данных
DBM (библиотека GDBM)
Getopt::Long Обработка параметров командной
строки
Getopt::Std Обработка однобуквенных параметров
командной
строки
I18N::Collate Сравнение 8-битных скалярных данных
в
соответствии с национальными
стандартами
IO Загрузка модулей ввода/вывода
IO::File Методы для работы с дескрипторами
файлов
IO::Handle Методы для работы с
дескрипторами
ввода/вывода
IO::Pipe Методы для работы с каналами
IO::Seekable Методы для работы с объектами
ввода/вывода
IO::Select Выбор системных вызовов
IO::Socket Обмен данными через сокеты
IPC::Open2 Открывает процесс на чтение и
запись
(одновременно)
IPC::Open3 Открывает процесс на чтение, запись
и
обработку ошибок (одновременно)
Math::BigFloat Создание чисел с плавающей
точкой
произвольной длины
Math::BigInt Создание целых чисел произвольной
длины
Math::Complex Работа с комплексными числами
Math::Trig Интерфейс Math::Complex
для
тригонометрических функций
продолжение И
Таблица 13.1 (продолжение )
Модуль Предназначение
NDBM_File Функции и классы для работы с базами
данных
DBM (библиотека NDBM)
Net::Ping Отправка ICMP-пакетов на удаленный
компьютер
Net::hostent Интерфейс к функциям gethost*
Net::netent Интерфейс к функциям getnet*
Net::protent Интерфейс к функциям getproto*
Net::servent Интерфейс к функциям getserv*
Opcode Запрещает именованные псевдокоды
Pod::Text Преобразует документацию в формате
POD (Plain
Old Documentation)
в форматированный текст ASCII
POSIX Интерфейс к функциям POSIX
(стандарт IEEE 1003.1)
SDBM_File Функции и классы для работы с базами
данных
DBM (библиотека SDBM)
Safe Выполнение кода в защищенном разделе
Search::Dict Поиск ключа в словаре
(аналог хэш-таблицы)
SelectSaver Сохранение и восстановление
дескрипторов
файлов
SelfLoader Загрузка функций исключительно
по требованию
Shell Выполнение команд командной оболочки
Socket Загрузка файла языка С socket.h
с
символическими именами для
констант, используемых
функциями
обмена данными через сеть
Symbol Манипулирование символами Perl
Sys:Hostname Позволяет получить имя компьютера
Sys::Syslog Интерфейс к вызовам системной
функции
syslog(3)
Term::Cap Интерфейс управления терминалом
Term::Complete Интерактивное заполнение слов
данными
Term::ReadLine Интерфейс для пакета readline
Test::Harness Выполняет сценарии Perl и
записывает
статистику
Text::Abbrev Создает таблицу сокращений
Text::ParseWords Синтаксический разбор текста
Text::Soundex Алгоритм Soundex
Text::Tabs Заменяет табуляции на
последовательности
пробелов, и наоборот
Text::Wrap Перенос длинных строк
Использование модулей Perl
Модуль Предназначение
Tie::Hash Определения для «связанных» хэшей
Tie::RefHash Определения для «связанных» хэшей
со
ссылками на ключи
Tie::Scalar Определения для «связанных»
скалярных
переменных
Tie::SubstrHash Создает таблицу фиксированного
размера с
алгоритмом хэширования
ключей, также
имеющих
фиксированный размер
Time::Local Возвращает время в соответствии
с локальными
установками и по
Гринвичскому меридиану
Time::gmtime Интерфейс для функции gmtime
Time::localtime Интерфейс для функции localtime
Time::tm Используется модулями Time::gmtime
и
Time::localtime
UNIVERSAL Базовый класс для всех классов
User::grent Интерфейс к функциям getgr*
User::pwent Интерфейс к функциям getpw*
Таблица 13.2. Стандартные прагмы Perl
Прагма Предназначение
blib Использовать деинсталлированную MakeMaker
версию
пакета
diagnostics Использовать расширенную
диагностику
предупреждающих сообщений
integer Использовать целочисленную арифметику
less Запрашивает у компилятора минимальную
реализацию
синтаксической конструкции
lib Управляет списком путей, в которых Perl будет
искать
сценарии
locale Задает работу функций, чувствительных
к локальным
настройками, с текущими
настройками locale
ops Ограниченное использование именованных
псевдокодов
overload Перегрузка операций Perl
re Изменяет работу регулярных выражений Perl
sigtrap Разрешает обработку (перехват) сигналов
strict Задает строгую проверку не вполне
безопасных
программных конструкций
subs Вынуждает декларировать подпрограммы
vmsish Использовать поведение, специфичное
для
операционной системы VMS
vars Вынуждает предварительное декларирование
имен
глобальных переменных
Непосредственные решения
Term::Cap — работа с терминалом
Модуль Term предназначен для работы с терминалом. Например, с помощью функции Tgoto можно переместить курсор в любую точку. В следующем примере он перемещается в строку 5, колонку 40, где и выводится слово «Perl». Для этого нам потребуются функции из модулей POSIX и Term (функция модуля POSIX определяет скорость вывода на терминал).
Перейдем к примеру. Сначала создается объект $termcap, соответствующий терминалу:
use POSIX;
use Term;
$termios = POSIX::Termios->new;
$termios->getattr;
$speed = $termios-getospeed;
$termcap = Term::Cap->Tgetent ({Term => undef,
OSPEED => $speed});
Теперь $termcap используется для очистки экрана с помощью метода Tputs и перемещения курсора в нужное место с помощью метода Tgoto:
use POSIX;
use Term;
$termios = POSIX::Termios->new;
$termios->getattr;
$speed = $termios-getospeed;
$termcap = Term::Cap->Tgetent ({Term => undef,
OSPEED => $speed});
$termcap->Tputs('cl', 1, *STDOUT);
$termcap->Tgoto('cm', 40, 5, *STDOUT);
print "Perl\n";
Итак, мы получили, что требовалось, — курсор попал в точку (5,40).
Подсказка. Этот сценарий будет работать только для терминалов или эмуляторов терминалов, поддерживающих управляющие escape-последовательности. Для окон DOS, работающих под управлением Windows, он работать не будет.
Math — комплексные числа и числа большой разрядности
Модуль Math служит для выполнения математических операций с комплексны ми числами или числами с большим числом разрядов. В следующем примере
POSIX — функции Portable Operating System Interface
создаются два комплексных числа (то есть числа, состоящих из вещественной и мнимой части), затем они складываются, а результат выводится на экран:
use Math::Complex;
$operand1 = Math::Complex->new(1, 2);
$operand2 = Math::Complex->new(3, 4);
$sum = $operand1 + $operand2;
print "Sum = $sum\n";
Sum = 4+6i
А вот как используется пакет BigInt, позволяющий работать с большими целыми числами (пакет BigFloat, позволяющий работать с большими числами с плавающей точкой, также существует). В следующем примере складываются два больших целых числа:
use Math::BigInt;
$int1 = 123456789123456789;
$int2 = 987654321987654321;
print "Sum of integers = ", $int1 + $int2, "\n";
Sum of integers = 1.11111111111111111e+18
Поскольку Perl не работает с большими числами напрямую, он преобразует их в числа с плавающей точкой. Вот как получить распечатку результата в формате целого числа:
use Math::BigInt;
$bint1 = Math::BigInt->new(`123456789123456789');
$bnt2 = Math::BigInt->new(`987654321987654321');
print "Sum of integers = ", $bint1->badd($bint2), "\n";
Sum of integers = 1111111111111111110
POSIX — функции Portable Operating System Interface
Как мы уже знаем из предыдущих глав, Лаборатория компьютерных систем Национального института стандартов и технологий (the National Institute of Standards and Technology Computer Systems Laboratory — NIST/CSL) в содружестве с другими организациями создала стандарт POSIX — Portable Operating System Interface. POSIX — это большая библиотека стандартизированных С-подобных функций, покрывающие стандартные потребности программирования.
Модуль Perl POSIX обеспечивает доступ почти ко всем функциям, стандартизи рованным в POSIX версии 1003.1. Модуль POSIX подключается к программе командой use:
use POSIX; # добавить всю библиотеку
use POSIX 'функция'; # добавить одну функцию
use POSIX qw(фун1 фун2); # добавить несколько функций
(Псевдокавычки qw/.../ (см. табл. 2.3 в главе 2), использованные в третьем варианте, являются самым простым способом создать список из строк-имен функций, заключенных в кавычки.)
Например, вот так используется функция strftime модуля POSIX, форматирую щая дату:
use POSIX 'strftime';
print strftime "Here's the date: %d/%m/%Y\n", localtime;
Here's the date: 30/10/1999
Если вы еще не знаете, какие функции содержатся в модуле POSIX, имеет смысл потратить некоторое время, чтобы ознакомиться с ними. Во многих случаях они даже менее платформозависимы, чем сам Perl.
Benchmark — тестирование производительности
Модуль Benchmark может служить для определения производительности программы, подобно секундомеру, включаемому при старте программы и выключаемому при ее окончании. (В многозадачных системах в игру иногда вступают посторонние факторы, например то, как планировщик отнесется к программе. В результате измеренное время может оказаться больше истинного времени ее работы.) В следующем примере с помощью объектов модуля Benchmark измеряется, сколько времени занимает миллион итераций цикла:
use Benchmark;
$timestamp1 = new Benchmark;
for ($loop_index= 0; $loop_index < 1_000_000;
$loop_index++)
{ $variable1 = 1; }
$timestamp2 = new Benchmark;
$timedifference = timediff(timestamp2, $timestamp1);
print "The loop took ", timestr($timedifference);
The loop took 5 wallclock secs ( 5.65 usr+ 0.00 sys = 5.65 CPU)
Time — измерение времени и преобразование форматов времени
Модуль Time позволяет преобразовывать локальное время или время по Гринвичскому меридиану в секунды, отсчитываемые «от наступления эпохи» (для Unix и большинства других операционных систем «начало эпохи» отсчитывается от 01.01.1970). Например, в следующем фрагменте кода с помощью подмодуля Time::Local вычисляется количество секунд от 01.01.1970 до 01.01.2000:
use Time::Local;
print timelocal(0, 0, 0, 1, 1, 2000);
949381200
Carp — сообщения об ошибках с указанием точки вызова
Команды warn и die сообщают только о текущем месте возникновения ошибки. Команды модуля Carp организованы так, что в сообщении об ошибке указывает
File — операции с файлами
ся точка вызова функции. Тем самым созданные с их помощью модули будут вести себя как встроенные функции, сообщая об ошибке пользователя, вызвавшего подпрограмму с неверными параметрами, а не об ошибке создавшего ее программиста J. Другими словами, программисты, использующие написанные вами модули, будут видеть не номер строчки внутри вашей подпрограммы, а номер строчки в своем исходном коде, что более важно для их работы. Вот пример использования команд из модуля Carp:
use Carp;
carp "This is a warning!";
croak "This is an error!";
confess "So long!";
(Первая команда выводит предупреждающее сообщение и продолжает выполнение кода. Вторая команда выводит сообщение об ошибке и прекращает выполнение программы. Третья печатает сообщение об ошибке и стек вызовов функций, после чего прекращает выполнение программы.)
locale — использование локальных настроек компьютера
Модуль locale — это на самом деле прагма, которая разрешает чувствительным к локальным настройкам подпрограммам из модуля POSIX1 использовать эту информацию. Прагма влияет на такие моменты, как выбор точки или запятой при выводе чисел с плавающей точкой, стандартный формат даты и т. д. Чтобы отключить влияние локальных настроек, используйте команду no locale. В следующем примере массив сортируется в соответствии с локальными настройками:
use locale;
@sorted = sort @unsorted;
File — операции с файлами
Модуль File обеспечивает поддержку работы с файлами. Например, подмодуль File::Copy содержит две отсутствующие в стандартной библиотеке Perl функции: copy (для копирования файлов) и move (для перемещения файла в новый каталог). В следующем примере файл file.txt копируется в file2.txt, а тот перемещается в каталог, расположенный на уровень выше текущего:
use File::Copy;
copy ("file.txt", "file2.txt");
move ("file2.txt", "..");
1 На самом деле, любым подпрограммам и функциям Perl, чувствительным к локальным настройкам (в частности, это относится к операциям сортировки, регулярным выражениям и т. д.). В Windows локальные настройки задаются с помощью функции setlocale. В Unix локаль обычно устанавливается на системном уровне, но можно задать ее и в программе. — Примеч. ред.
Net — доступ к сети Интернет
Модуль Net содержит подпрограммы для работы с сетью и удаленными компьютерами. В следующем примере модуль Net::Ping используется для проверки соединения с удаленным компьютером. Сначала создается объект $pingobject, который методом ping будет отправлять тестовые пакеты указанному компьютеру. При этом можно использовать различные протоколы, например TCP, ICMP или UDP. Вызов метода new, создающего объект, имеет формат:
$pingobject = New::Ping->new([протокол
[, время-ожидания [, число-байтов ]]]);
Все параметры являются необязательными:
· протокол может принимать значения 'tcp', 'udp' или 'icmp' (по умолчанию используется 'udp');
· время ожидания задается в секундах;
· число-байт задает размер пакета, посылаемого удаленному компьютеру (максимум равен 1024).
Вызов метода, выполняющего отправку пакета удаленному компьютеру, имеет необязательный параметр, задающий время ожидания ответа:
$pingobject->ping(имя-компьютера [, время-ожидания ]);
По окончании работы объект закрывается с помощью метода close. В следующем примере демонстрируются возможности модуля Net::Ping:
use Net::Ping;
$pingobject = Net::Ping->new(icmp);
if ($pingobject->ping('yourserver.com'))
{ print "Could reach host." };
$pingobject->close();
Could reach host.
Safe — безопасное выполнение кода
Модуль Safe позволяет выполнять код в безопасном режиме за счет создания особого раздела, функционирующего независимо от остальной части программы. Вы можете указать, какие функции разрешено вызывать в этом разделе, с помощью метода permit. Поскольку в наше время секретности уделяется большое внимание, модуль Safe весьма разросся и включает множество встроенных методов. В следующем примере мы создаем новый раздел для выполнения кода, разрешаем использовать в нем команду print, а затем выполним некоторый код, используя метод reval модуля Safe:
use Safe;
$safecompartment = new Safe;
$safecompartment->permit(`print');
$result = $safecompartment->reval("print \"Hello!\";");
Hello!
Tk: кнопки и текстовые интерфейсные элементы
Tk — средства работы с библиотекой Tk
Взаимодействие между интерпретатором Perl и графической библиотекой Tk является очень популярной темой, поэтому в нашей книге мы покажем несколько примеров того, как функции Tk вызываются из Perl. Если вы имеете опыт работы с Tcl/Tk, большая часть кода приводимых примеров будет для вас очевидной. (Если нет, то документация Perl/Tk поможет вам разобраться.) Базовый процесс очень прост: модуль Tk подключается с помощью команды use Tk, создается главное окно, затем создаются и упаковываются в виде объектов необходимые интерфейсные элементы Tk. При их создании указываются необходимые параметры. После инициализации элементов вызывается функция MainLoop. Она передает контроль над интерфейсными объектами модулю Tk. В результате появляется окно с интерфейсными элементами.
В нескольких последующих разделах будут приведены примеры работы с модулем Tk. Чтобы разобраться с ними, читателю потребуется некоторый опыт программирования библиотеки Tk.
Tk: кнопки и текстовые интерфейсные элементы
Начнем рассмотрение примеров использования функций Tk в Perl с программы, которая создает окно и помещает в него кнопку и текстовый элемент. Когда вы щелкаете по кнопке, программа выводит текст «Hello!» в текстовом элементе. Результат показан на рис. 13.1.
use Tk;
$topwindow = MainWindow->new();
$topwindow->Label(
'-text' => 'Button and text widget example'
)->pack();
$topwindow->Button(
'-text' => "Click Me!",
'-command' => \&display
)->pack('-side' => "left");
$text1 = $topwindow->Text('-width' => 40,
'-height' => 2)->pack();
$text1->bind('<Double-1>', \&display);
sub display
{
$text1->insert('end', "Hello!");
}
MainLoop;
Рис. 13.1. Отображение кнопки Tk и текстового элемента
Tk: кнопки с зависимой и независимой фиксацией
Данный пример показывает, как вывести кнопки с зависимой (radiobuttons) и независимой (checkbuttons) фиксацией, а также определить, какие именно кнопки выбраны пользователем. Результат показан на рис. 13.2.
use Tk;
$topwindow = MainWindow->new();
$topwindow->Label(
'-text' => 'Radio- and checkbutton widget example'
)->pack();
$topwindow->Radiobutton(
'-text' => "Radio 1", '-value' => "1",
'-command' => sub
{ $text1->delete('1.0', 'end');
$text1->insert('end', "You clicked radio 1"); }
)->pack();
$topwindow->Radiobutton(
'-text' => "Radio 2", '-value' => "0",
'-command' => sub
{ $text1->delete('1.0', 'end');
$text1->insert('end', "You clicked radio 2"); }
)->pack();
$topwindow->Checkbutton(
'-text' => "Check 1", '-value' => "0",
'-command' => sub
{ $text1->delete('1.0', 'end');
$text1->insert('end', "You clicked check 1"); }
)->pack();
$topwindow->Checkbutton(
'-text' => "Check 2", '-value' => "0",
'-command' => sub
{ $text1->delete('1.0', 'end');
$text1->insert('end', "You clicked check 2"); }
)->pack();
$text1 = $topwindow->Text('-width' => 40,
'-height' => 2)->pack();
MainLoop;
Рис. 13.2. Кнопки с зависимой фиксацией и кнопки с независимой фиксацией библиотеки Tk
Tk: интерфейсный элемент «шкала»
Tk: интерфейсный элемент «список»
В этом примере выводится список. Когда пользователь выбирает элемент списка, дважды по нему щелкнув, его выбор отображается в текстовом элементе. Результат показан на рис. 13.3.
use Tk;
$topwindow = MainWindow->new();
$topwindow->Label(
'-text' => 'Listbox widget example'
)->pack();
$listbox1 = $topwindow->Listbox(
"-width" => 25,
"-height" => 5
)->pack();
$listbox1->insert('end', "Apples", "Bananas", "Oranges",
"Pears", "Pineapples");
$listbox1->bind('<Double-1>', \&getfruit);
$text1 = $topwindow->Text(
"-width" => 40,
"-height" => 2
)->pack();
sub getfruit
{
$fruit = $listbox1->get('active');
$text1->insert('end', "$fruit");
}
MainLoop;
Рис. 13.3. Интерфейсный элемент «список» библиотеки Tk
Tk: интерфейсный элемент «шкала»
В этом примере мы выведем интерфейсный элемент «шкала» библиотеки Tk. Выбранное пользователем положение шкалы отображается в текстовом интерфейсном элементе. Результат показан на рис. 13.4.
use Tk;
$topwindow = MainWindow->new();
$topwindow->Label(
'-text' => 'Scale widget example')->pack();
продолжение И
$topwindow->Scale(
'-orient' => 'horizontal', '-from' => 0,
'-to' => 200, '-tickinterval' => 40,
'-label' => 'Select a value:', '-length' => 200,
'-variable' => \$value, '-command' => \&display
)->pack();
$text1 = $topwindow->Text(
"-width" => 40, "-height" => 2
)->pack();
sub display
{ $text1->delete('1.0', 'end');
$text1->insert('end', "$value"); }
MainLoop;
Рис. 13.4. Интерфейсный элемент «шкала» библиотеки Tk
Tk: интерфейсные элементы графики («канва»)
В этом примере создается интерфейсный элемент «канва» библиотеки Tk и в нем рисуется голубой овал. Результат показан на рис. 13.5.
use Tk;
$topwindow = MainWindow->new();
$canvas1 = $topwindow->Canvas(
'-width' => 200, '-height' => 200
)->pack();
$canvas1->create('oval', '50', '50', '160', '160',
'-fill' => "blue");
MainLoop;
Рис. 13.5. Интерфейсный элемент рисования «канва» библиотеки Tk
Tk: интерфейсные элементы меню
Tk: интерфейсные элементы меню
В этом примере мы создаем строку меню с двумя разделами: File и Edit. Когда пользователь выбирает пункт меню (рис. 13.6), мы показываем в текстовом интерфейсном элементе, какой именно пункт выбран (рис. 13.7).
Рис. 13.6. Меню библиотеки Tk
Рис. 13.7. Результат выбора пункта меню
use Tk;
my $topwindow = MainWindow->new();
$menubar = $topwindow->Frame()->pack('-side' => 'top',
'-fill' => 'x');
$filemenu = $menubar->Menubutton('-text' => 'File'
)->pack('-side' => 'left');
$filemenu->command('-label' => 'Open',
'-command' => sub
{ $text->delete('1.0', 'end');
$text->insert('end', "You clicked Open."); }
);
$filemenu->separator();
$filemenu->command('-label' => 'Exit',
'-command' => sub {exit}
);
$editmenu = $menubar->Menubutton(
'-text' => 'Edit'
)->pack('-side' => 'left');
$editmenu->command('-label' => 'Search',
'-command' => sub
{ $text->delete('1.0', 'end');
$text->insert('end', "You clicked Search."); }
);
$editmenu->command('-label' => 'Replace',
'-command' => sub
{ $text->delete('1.0', 'end');
$text->insert('end', "You clicked Replace."); }
);
продолжение И
$topwindow->Label('-text' => 'Menu widget example.'
)->pack();
$text = $topwindow->Text(
'-width' => 40,
'-height' => 3
)->pack();
MainLoop;
Tk: окна диалога
В этом примере создается окно диалога, которое появляется, когда пользователь щелкает на соответствующей кнопке главного окна (рис. 13.8). Пользователь может ввести текст в строке ввода окна диалога, а после нажатия кнопки OK вглавном окне отображается введенный текст (рис. 13.9).
use Tk;
$topwindow = MainWindow->new();
$dialog = $topwindow->Dialogbox('-title' => 'Dialog Box',
'-buttons' => ['OK', 'Cancel']);
$entry = $dialogbox->add("Entry",'-width' => 40)->pack();
$topwindow->Label('-text' => 'Dialog widget example.')->pack();
$topwindow->Button('-text' => 'Show dialog box',
'-command' => \&show)->pack();
$text1 = $topwindow->Text('-width' => 40,'-height' => 2)->pack();
MainLoop;
sub show
{ $result = $dialog->Show;
if ($result eq "OK")
{ $text1->delete('1.0', 'end');
$text1->insert('end', $entry->get); } }
Рис. 13.8. Окно диалога библиотеки Tk
Рис. 13.9. Данные, введенные в окне диалога