Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

LabLinux / laba3_m3_iems_iems_ktni_niy16

.pdf
Скачиваний:
46
Добавлен:
27.03.2016
Размер:
362.52 Кб
Скачать

Модуль 3. Лабораторная работа №3 Программирование в среде PERL

Цель работы: имея навыки программирования в SHELL и AWK, получить навыки программирования в среде PERL .

Теоретические сведения

Разработчики СБИС и обычные пользователи отводят программированию в Linux большую роль. Это связано, прежде всего, с частичной или полной автоматизацией выполнения проектов. Кроме того, работа с прикладными программами САПР требует от проектировщика не только специальных знаний в области проектирования СБИС, повышенного внимания, но также умения на высоком уровне работать с операционной системой Linux и ее прикладными программами. При работе с САПР пользователь должен уметь определять и переопределять переменные окружения, которые используются в программах, назначать псевдонимы, выполнять базовые операции с файловой системой и много, уметь инсталлировать и деинсталлировать отдельные программное продукты, а также уметь выполнять много другое. Некоторые из перечисленных операций требуется выполнять систематически, что не только отнимает время, но также является неэффективной работой. Поэтому снижение нагрузки пользователя связано автоматизацией этих процессов.

В данной лабораторной работе мы познакомимся с новой средой программирования – PERL. PERL является не только эффективным средством программирования, которое позволяет частично автоматизировать базовые функции пользователя (разработчика СБИС), он также повсеместно используется опытными программистами, так как дает возможность создавать программные приложения высокого уровня.

Язык программирования Perl (Practical Extraction and Report Language) - это язык сценариев, который изначально предназначался для формирования отчетов и обработки файлов большого объема. Этот язык реализован в виде ядра, к которому легко добавлять новые функции. За последние годы возможности языка были значительно расширены. В настоящее время с помощью Perl можно проверять сетевые соединения, контролировать взаимодействие между процессами и даже управлять базами данных.

Выполнение Perl-сценариев из командной строки. Любой оператор Perl

может быть вызван из командной строки. С этой целью применяется команда perl с опцией -е. Выполняемый оператор интерпретатора заключается в одинарные кавычки. В качестве примера приведена команда с оператором print, выводящая строку «hello». Обратите внимание на то, что строка оператора Perl завершается точкой с запятой.

Perl -e 'print "hello";'

Таким образом, Perl можно использовать для выполнения простых действий, подобно однострочным командам awk. В отличие от утилиты awk, Perl-программы по умолчанию не считывают данные из стандартного ввода. Считывание обычно задается с помощью цикла while. В следующем примере осуществляется поиск по

шаблону «Dickens». Содержимое файла books считывается с помощью команды cat, а затем перенаправляется команде perl в виде стандартного потока ввода.

cat books | perl -e 'while (<STDIN>) { if (/Dickens/) { print; }}'

Из командной строки операторы Perl выполняются довольно редко. Обычно они помещаются в файлы сценариев, а затем уже выполняются, что напоминает shellсценарии.

Сценарии Perl. Обычно операторы Perl помещаются в файл, а затем считываются и выполняются с помощью команды perl. Файлы, содержащие команды Perl, должны иметь расширение .pl. Существует два способа выполнения сценариев Perl с помощью команды perl. Согласно первому способу в командной строке интерпретатора shell указывается команда perl с именем сценария Perl. Затем интерпретатор Perl считывает и выполняет введенные команды. В следующем примере выполняется сценарий Perl под названием hello.pl:

$ perl hello.pl

Теперь рассмотрим второй способ. В файл сценария Perl помещается команда perl. В этом случае автоматически вызывается интерпретатор Perl, выполняющий введенные команды. Путь /usr/bin/perl определяет местоположение команды perl в системе Open-Linux. В других системах команда perl может находиться в каталоге /usr/local/bin. Команда which perl возвращает местоположение интерпретатора Perl в системе. В первой строке файла сценария следует указывать полное имя команды запуска интерпретатора, например:

#!/usr/bin/perl

Сценарий может быть выполнен при условии, что для его файла установлено право на выполнение. Для этого необходимо применить команду chmod с параметром 755. Для каждого сценария эта операция производится только один раз. Если команда perl активизируется из командной строки (как указывалось ранее), то изменять права доступа к файлу не нужно. В следующем примере задаются права на выполнение сценария hello.pl.

$ chmod 755 hello.pl

Как и в языке программирования «Си», в Perl-программе команды принято завершать точкой с запятой. Сходство с «Си» проявляется и в том, что в Perl употребляются те же символы перехода на новую строку, \n, и табуляции, \t (табл. 1). Строки комментариев начинаются с символа #.

 

Таблица 1 – Управляющие символы Perl

Управляющий

Описание символа

символ

 

\ а

Подача звукового сигнала

\b

Возврат курсора на один символ

\cC

Управляющая комбинация символов Control + С. Символы \cD

 

соответствуют комбинации клавиш [Control+D]

\ f

Переход на следующую страницу

\e

Символ Esc

\n

Переход на новую строку

\r

Переход в начало текущей строки (возврат каретки)

\t

Символ табуляции (переход к следующей позиции табуляции)

\\

Символ обратной косой черты

\"

Кавычки

\uC

Переводит символ С в верхний регистр

\lC

Переводит символ С в нижний регистр

\Lтекст\E

Переводит все символы текста, находящиеся между парами символов \L

 

и \Е, в нижний регистр

\Uтекст\E

Переводит все символы текста, содержащиеся между парами

 

символов \L и \Е, в верхний регистр

Ниже приведен пример сценария Perl. Этот сценарий выводит слово «hello», а затем осуществляет переход на новую строку. Обратите внимание на то, что в первой строке производится вызов команды perl:

helloprg #!/usr/bin/perl print "hello \n" $ helloprg hello

Хотя Perl и является интерпретируемым языком, перед выполнением проверяется весь сценарий Perl. Сведения об ошибках любого рода отображаются на экране с указанием номеров соответствующих строк. Многие сообщения об ошибках бывают недостаточно ясными. Ниже перечислены наиболее распространенные ошибки:

Одной из самых распространенных ошибок является отсутствие точки с запятой в конце строки. Операторы Perl похожи на команды интерпретатора shell, при вводе которых точка с запятой в конце строк не употребляется, поэтому в сценариях Perl легко забыть об этом знаке.

Управляющие структуры должны включать блоки операторов; в

интерпретаторе Perl не допускается применение одинарных операторов, как в языке «Си». Блок представляет собой набор операторов, заключенных в фигурные скобки { }.

Переменным всегда должен предшествовать символ $. Это существенное отличие от синтаксиса языков awk и «Си».

Модули Perl. Фрагменты программы на Perl можно поместить в отдельные файлы, а затем использовать в основной программе, указывая имена файлов в операторе use. Такие файлы имеют расширение .pm и называются пакетами (packages) либо модулями (modules). Чаще всего в модуль помещают набор операторов, предназначенный для решения некоторой задачи, например для обработки файла либо поиска текста. Стандартный набор модулей и пакетов Perl находится в каталоге /usr/lib/perl5. На man-странице perlmod подробно рассматриваются пакеты и модули Perl, в том числе и динамически загружаемые модули. Следующий оператор языка Perl задает использование модуля find.pm, который содержит программу, аналогичную shell-команде find. Эта команда служит для выполнения поиска в каталогах.

use /usr/lib/perl5/File/find.pm;

Для использования модуля в составе сценария Perl следует ввести ключевое слово use, а затем указать полное имя модуля. Имя модуля состоит из двух частей, разделенных двумя символами двоеточия. В левой части указывается имя категории модуля, а в правой — собственно имя. Например, имя модуля, предназначенного для выполнения шифрования с помощью шифра Блоуфиш (Blowfish), имеет вид Crypt::Blowfish. Фактически эта запись служит указанием

каталога, где находится модуль (в данном случае Crypt), и имени файла модуля — Blowfish.pm. Применить этот модуль в сценарии позволит следующая строка:

use Crypt::Blowfish;

Из Internet загружается файл с исходным кодом модуля. После загрузки исходный код следует сначала скомпилировать, а затем инсталлировать. Также можно воспользоваться сценарием CPAN, который инсталлируется при установке Perl и обеспечивает автоматический доступ к серверам CPAN, а также нахождение, загрузку и инсталляцию модуля Perl в вашей системе. Для выполнения всех перечисленных действий достаточно ввести одну команду, например:

perl -MCPAN -е shell

Ввод и вывод в Perl. Данные для сценария Perl могут поступать из различных источников; файлов, потока стандартного ввода и каналов. Поэтому в программе необходимо идентифицировать источник входной информации. Это означает, что, в отличие от языка awk и подобно shell-программе, сценарий Perl должен иметь точные указания относительно считывания вводимой информации. Ее источник точно определяется с помощью дескриптора файла — имени, которым этот источник, например файл на диске, обозначается в программах. В Perl заранее заданы дескрипторы файлов для стандартных потоков ввода и вывода, а также для стандартного потока ошибок. Для стандартного ввода используется дескриптор файла STDIN.

Ситуация аналогична и при выводе данных. Интерпретатор Perl может выводить информацию в файлы и каналы, а также на стандартный вывод. Дескрипторы применяются для идентификации файлов и каналов как при вводе, так и при выводе данных. Дескриптор файла STDOUT идентифицирует стандартный вывод, а дескриптор файла STDERR используется для обозначения стандартного потока сообщений об ошибках. Сначала рассмотрим, как Perl использует стандартный ввод и вывод данных, а затем обсудим методы выполнения операций с определенными файлами.

Perl может считывать данные со стандартного ввода либо из любого указанного файла. Команда чтения входной информации состоит из символов «меньше чем»

(<) и «больше чем» (>). Чтобы обеспечить чтение информации из файла, между этими символами помещается имя дескриптора файла — <MYFILE>. Для считывания данных со стандартного ввода достаточно воспользоваться дескриптором файла STDIN, который действует подобно команде read оболочки

BASH shell. <STDIN>

Чтобы воспользоваться данными, считанными с помощью оператора <STDIN>, следует присвоить их переменной. Можно обратиться к переменной, определенной пользователем, либо к переменной $_, заданной по умолчанию, как показано в следующем примере. У многих команд значением по умолчанию является значение переменной $_. Так, если для команды print не указаны аргументы, выводу подлежит значение переменной $_, При использовании команды chomp без аргументов из значения переменной $_ удаляется конечный символ новой строки. Представленный ниже сценарий mуread иллюстрирует применение переменной $_ вместе со стандартным потоком ввода.

myread

#! /usr/bin/perl

# Программа, предназначенная для чтения и отображения данных, введенных с клавиатуры.

$_ = <STDIN>; # Чтение данных из стандартного потока ввода print "This is what I entered: $_"; # Вывод считанных данных в качестве части строки.

$ royread

larisa and aleina

This is what I entered: larisa and aleina

Оператор print можно применять для записи данных в файл или в стандартный поток вывода. Имена дескрипторов файлов указываются после ключевого слова print перед выводимыми данными. Если дескрипторы файлов не заданы, оператор print помещает данные в стандартный поток вывода. В следующих двух примерах строка «hello» передается на стандартное устройство вывода. Дескриптор файла для стандартного вывода — STDOUT. При отсутствии аргумента оператор print выводит данные, которые считаны из стандартного ввода.

print STDOUT "hello"; print "hello";

Дескрипторы файлов Perl. Для создания дескриптора файла или канала предназначен оператор open. Этот оператор имеет два аргумента: имя создаваемого дескриптора файла и имя файла. Имя дескриптора принято вводить в верхнем регистре. В качестве второго аргумента может выступать не только имя файла, но и имя переменной, содержащей название файла. Также указываются различные режимы открытия файла. По умолчанию файл открывается для чтения, но его также можно открыть для записи, для добавления данных либо для выполнения обеих операций. Ниже приведен пример синтаксиса оператора open:

open (дескриптор-файла, строка-имени-файла);

В следующем примере пользователь открывает файл «reports» с дескриптором

REPS:

open (REPS, "reports");

Довольно часто имя файла является значением переменной. Для обозначения файла в этом случае употребляются символ $ и имя переменной. В следующем примере имя файла «reports» содержится в переменной filen:

$filen = "reports";

open (REPS, $filen );

Чтобы открыть файл в определенном режиме, необходимо предварить имя файла соответствующими символами. Эти два компонента разделяются пробелом. Так, символ > употребляется, если файл должен быть открыт для записи, а символ +> — для чтения и записи. В следующем примере задано открытие файла «reports» для чтения и записи.

open (REPS, "+> reports");

Если для хранения имени файла используется переменная, то эта же переменная применяется для задания имени файла, как показано ниже:

open (REPS, "+> $filen");

Чтобы прочитать информацию из открытого файла, нужно указать его дескриптор между символами < и >. Дескриптор <REPS> употребляется для считывания строки из файла «reports». Программа myreport открывает файл «reports» и выводит его содержимое на экран.

myreport.pl

#!/usr/bin/perl

# Программа чтения строк из файла reports и вывода их на экран open(REPS, "<reports"); # Открытие файла reports только для чтения

while ($ldat = <REPS>) # Прочитать строку из файла reports

{

print $ldat; # Вывести последнюю из прочитанных строк на экран

}

close REPS; # Закрыть файл

Интерпретатор Perl располагает полным набором встроенных операторов, предназначенных для работы с каталогами. По принципам работы эти операторы напоминают файловые функции. Оператор opendir выполняет открытие каталога, это действие напоминает открытие файла. Каталогу назначается его дескриптор. Оператор readdir считывает первый элемент каталога, другими словами, он возвращает имена файлов и каталогов, находящихся в данном каталоге. Оператор closedir закрывает каталог, оператор chdir позволяет перейти в другой каталог, оператор mkdir предназначен для создания каталогов, а посредством оператора rmdir осуществляется удаление каталогов.

Переменные и выражения Perl. Переменные Perl могут быть числовыми или строковыми. Тип переменной зависит от контекста, то есть от способа ее использования. Объявлять переменные не нужно. Переменная, которой присваивается числовое значение и которая применяется в арифметических операциях, является числовой. Все остальные переменные считаются строковыми. Признаком переменной в программе, как и при работе в shell, служит символ $ перед ее именем.

Переменные в Perl используются в тех же операторах, что и в языке «Си», за исключением строковых операторов. Для сравнения строковых переменных применяются специальные операторы, те же, что и в интерпретаторе Bourne shell, а не стандартные операторы сравнения, которые употребляются только с числовыми переменными. Остальные операторы, например присваивания, используются как со строковыми, так и с числовыми переменными. В следующем примере переменной myname присваивается строковое значение «Larisa». Роль оператора присваивания играет символ = (табл. 3).

$myname = "Larisa";

Числовой переменной может быть присвоено числовое значение — целочисленное или с плавающей запятой. Все значения с плавающей запятой в языке Perl являются числами с двойной точностью.

$mynum = 45; $price = 54.72;

Perl поддерживает и арифметические выражения. Он допускает выполнение всех стандартных арифметических операций, производимых при работе с другими языками программирования. Для группировки выражений надлежит употреблять круглые скобки (табл. 3). В качестве операндов могут выступать числовые константы, числовые переменные или другие числовые выражения. В следующих примерах переменной $mynum присваивается результат сложения двух чисел. Ее значение затем используется в другом арифметическом выражении, результат которого присваивается переменной $price.

$mynum = 3 + 6;

$price = (5 * ($mynum / 3);

Язык программирования Perl в полной мере поддерживает набор операций присваивания, которые используются в процессе работы с языками awk и «Си». Операции ++ и — выполняют инкремент и декремент содержимого переменной.

Операция += увеличивает, а операция -= уменьшает Значение переменной. Например, оператор i++ эквивалентен оператору i = i + 1, а оператор i += 5 соответствует i = i + 5. Операция инкремента широко применяется в циклах.

Не обязательно включать в строку значение, можно поместить в нее имя соответствующей переменной. В следующем примере значением переменной $nameinfo яв-

ляется строка «My name is Larisa \n»: print "The number of items is $mynum \n" $nameinfo = "My name is $myname \n"

Арифметическая операция

Описание

*

Умножение

/

Деление

+

Сложение

-

Вычитание

%

Модуль – результат представляет собой остаток

 

от деления

**

Возведение в степень

Операции сравнения

Описание

>

Больше чем

<

Меньше чем

>=

Больше или равно

<=

Меньше или равно

= =

Равно

!=

Не равно

Операции инкремента и

Описание

декремента

 

++

Увеличение значения переменной на единицу

- -

Уменьшение значения переменной на единицу

Операции арифметического

Описание

присваивания

 

+=

Увеличение на определенное значение

-=

Уменьшение на определенное значение

Предположим, требуется, чтобы значением переменной стали данные, считанные из файла. Для этого нужно присвоить ей результат операции чтения. В следующем примере данные, считанные со стандартного ввода, присваиваются переменной $mydata:

$mydata = <STDIN>;

При считывании данных с клавиатуры во входную строку попадает и символ возврата . каретки. Возможно, вы не захотите, чтобы этот символ присутствовал в значении, присваиваемом переменной. Исключить его позволяет команда chomp, которая удаляет последний символ в строке, chomp $myinput. В следующем примере пользователь вводит свое имя, которое становится значением переменной $myname. Содержимое переменной $myname впоследствии выводится как часть строки. Прежде чем значение переменной $myname будет использовано в другой строке, из нее с помощью команды chomp удаляется символ возврата каретки.

readname.pl #!/usr/bin/perl $myname = <STDIN>;

chomp $myname;

print "$myname .just ran this program\n";

$ myread.pl larisa Petersen

larisa Petersen just ran this program

Массивы и списки. Процесс создания массива в Perl состоит в том, что переменной, обозначающей массив, присваивается список значений. В чем специфика этого списка в Perl? Значения заключаются в круглые скобки и разделяются запятыми. В следующем примере представлен список из четырех значений:

(23, 41, 92, 7)

Чтобы присвоить значения списка элементам массива, необходимо предварить имя массива знаком @. Значения присваиваются в том порядке, в котором они представлены в списке.

@mynums = (23, 41, 92, 7 ) ;

Когда массив готов, можно обращаться к его элементам по отдельности. Нумерация элементов массива начинается с 0, а не с 1. Массив mynums содержит четыре элемента, пронумерованных от 0 до 3. К элементам массива можно обращаться по индексу, который принято заключать в квадратные скобки. Индекс [0] соответствует первому элементу, а [2] — третьему. В следующем примере выводятся значения первого и четвертого элементов. Заметьте, что перед названием массива стоит символ $.

print $mynums[0] ; print $mynums[2] ;

Любому элементу можно присвоить новое значение. Обратите внимание: перед отдельным элементом массива ставится знак $, а не @. Знак @ служит для обозначения всего массива в целом и употребляется в процессе присвоения ему списков значений. Знак $ следует рассматривать как обозначение конкретного элемента, который по сути является переменной.

$mynums[2] = 40;

Число элементов в массиве не ограничено. Для того чтобы добавить новый элемент, нужно просто присвоить ему значение. В результате выполнения следующей операции присваивания в массив mynums добавляется пятый элемент.

$myrmms [4] = 63;

С каждым массивом связана специальная переменная, обозначаемая следующим образом: # имя_массива. Значением этой переменной является текущее число элементов массива. Например, значение переменной #mynums — это число элементов в массиве mynums. В следующем примере задан вывод на экран количества элементов этого массива.

print "$#mynums";

Значения в списке, присваиваемые элементам массива, не обязательно должны иметь один тип. Это могут быть числа, строки и даже переменные. В этом случае элементы массива также будут разного типа (числовыми, строковыми и т. п.). В следующем примере элементам массива myvar присваиваются разнотипные значения.

@myvar = ("aleina", 11, 4.5, "a new car");

Для того чтобы команда оперировала всеми элементами массива, нужно указать имя массива с префиксом @. В следующем примере на экран выводятся все значения массива mynums:

print @mynums;

Символ @ употребляется вместо символа $, потому что массив не является простой переменной. Он содержит список значений, а в качестве переменных выступают отдельные элементы массива. Символ @ употребляется и во время присваивания значений одного массива другому. В следующем примере значения всех элементов массива mynums присваиваются соответствующим элементам массива newnums. Обратите внимание на то, что символ @ указан и перед именем массива mynums. Можно считать, что выражение @mynums преобразовывается в список значений массива mynums, после чего значения списка присваиваются элементам массива newnums.

@newnums = @mynums;

Список значений массива может использоваться в строке символов, как и значение переменной. В следующем примере значения элементов массива встраиваются в строку, которая затем присваивается переменной myreport. Заметьте: в качестве префикса в имени массива @mynums употребляется знак @.

$myreport = "Here are the numbers I have: @mynums \n"; print $myreport;

Переменные, выступающие в качестве элементов массива, обозначаются с помощью индекса и символа $. В следующем примере используется значение третьего элемента массива mynums:

$myelement= "This is the value of the third element: $mynums[2] \n"; print $myelement;

Функции обработки массивов: операции над списками. В Perl существует набор функций, которые облегчают обработку массивов пользователем. С помощью простых команд можно выполнять базовые операции с массивами: получать список значений массива, сортировать элементы массива, последовательно обращаться к ним и т. д. Таким образом, массив можно рассматривать как список, а функции — как операции над списками. В табл. 4 дан обзор функций обработки массивов и списков.

Функция push добавляет новый элемент в конец массива, а функция pop удаляет последний элемент. Аргументами функции push являются имя массива и список значений, которые нужно добавить в массив в качестве новых элементов.

За один раз можно добавить несколько новых элементов. Функция pop удаляет из массива последний элемент и возвращает его значение. Функции shift и unshift обрабатывают начало списка. Функция unshift удаляет первый элемент списка, после чего первую позицию занимает тот элемент, который ранее был вторым; shift добавляет в начало списка новый элемент. Аргументом функции unshift является имя массива. Возвращает эта функция значение удаленного элемента. Аргументы функции shift — имя массива и значение элемента, который вы хотите вставить. Эта функция возвращает общее число элементов на текущий момент. Функция sort сортирует элементы массива в соответствии с используемой в системе кодовой таблицей символов (обычно это набор символов ASCII), располагая элементы, в порядке возрастания. Функция split используется для создания массива и присваивания ему значений, полученных из строки. Для обозначения в строке извлекаемых значений применяется заданный разделитель. В результате

формируется список значений, которые присваиваются элементам массива. Функция split часто употребляется для обработки строк входных данных, которые уже разбиты на поля, разделенные символом, например запятой или двоеточием. Функция grep представляет собой средство поиска в массиве или списке. Она работает так же, как и одноименная утилита в операционной системе Linux, а ее аргументами являются образец для поиска и имя массива. Функция grep возвращает значение совпавшего с образцом элемента.

 

Таблица .4. Операции с массивами

Операции со скалярными

Назначение

массивами, ©array

 

push (массив, список-значений)

Добавление элемента в конец массива

pop (массив)

Удаление последнего элемента массива

shift (массив, список-значений)

Добавление элемента в начало массива

unshift (массив)

Удаление первого элемента массива

sort (массив)

Сортировка элементов массива по возрастанию

reverse (массив)

Сортировка элементов массива по убыванию

split (разделитель, строка)

Разбивка строки на элементы. Разделитель может быть

 

регулярным выражением или строкой

join (разделитель, массив)

Объединение элементов массива в одну строку

grep (массив, шаблон)

Поиск образца среди элементов массива

splice (массив, индекс)

Удаление указанного элемента из массива. Элементы

 

нумеруются с нуля

splice (массив, индекс, число)

Удаление из массива указанного количества

 

последовательных элементов

splice (массив, число, 0, строка)

Вставка в массив элемента со значением строка

splice (массив, $targv, 0, строка)

Добавление нового элемента в конец массива

Операции с ассоциативными

Назначение

массивами, %аггау

 

keys (%ассоц~массив)

Генерирование списка всех индексных строк в

 

ассоциативном массиве

values (%ассоц-массив)

Генерирование списка значений всех элементов в

 

ассоциативном массиве

each (%ассоц-массив)

Возврат значения следующего элемента и его

 

индексной строки

delete (%ассоц-масив, индекс-

Удаление из ассоциативного массива элемента с

строка)

указанным индексом

undef (массив)

Удаление всего массива (скалярного или

 

ассоциативного)

Ассоциативные массивы. В ассоциативном массиве для индексации элементов вместо числовых значений применяются строки. Индексную строку можно считать ключевым словом, которое используется для поиска элемента. В Perl ассоциативный массив определяется с помощью символа %, указываемого перед его именем. Список присваиваемых значений состоит из пар «индексная строка—значение элемента». За индексной строкой следует значение элемента, затем — следующая индексная строка и значение элемента и т. д. В приведенном ниже примере определяется ассоциативный массив city, состоящий из четырех элементов, каждый из которых имеет целочисленное значение и индексную строку в виде названия города.

%city = ('Sacramento', 4, 'Fallen', 86, 'Napa', 7, 'Alameda', 53 ) ;

Соседние файлы в папке LabLinux