Perl Технология программирования   Компьютерная графика Экономическая информатика   3GL   к 4GL

Введение в язык программирования Perl

Синтаксис

Perl программа (скрипт) состоит из последовательности деклараций и предложений. Единственно что должно быть обязательно декларировано, это форматы отчетов и подпрограммы (функции). Все необъявленные переменные, массивы имеют значение 0 или null.

Декларации (объявления).

Perl имеет свободный формат. Комментарии начинаются с символа '#' и продолжаются до конца строки. Декларации могут использоваться в любом месте программы так же как и предложения (statements), но действуют они только в фазе компиляции программы. Обычно их помещают или в начале или в конце программы. Декларация подпрограмм позволяет использовать имя подпрограммы как списковый оператор, начиная с момента декларирования.
Пример:

	sub test;	# Декларация подпрограммы test

	$var1 = test $0; # Использование как оператора списка.

Декларации подпрограмм могут быть загружены из отдельного файла предложением require или загружены и импортированы в текущую область имен предложением use. Подробно см. главу Модули.

Простое предложение.

Простое предложение обязательно заканчивается символом ';' если только это не последнее предложение в блоке где ';' можно опустить. Заметьте, что существуют операторы такие как eval{} и do{}, которые выглядят как сложные предложения, но на самом деле это термы и требуют обязательного указания конца предложения.

Любое простое предложение может содержать single модификатор перед ';'. Существуют следующие single модификаторы:

	if EXPR
	unless EXPR
	while EXPR
	until EXPR

где EXPR - выражение, возвращающее логическое значение true или false. Модификаторы while и until вычисляются в начале предложения кроме блока do, который выполняется первым.

if EXPR- Модификатор "если". Предложение выполняется, если EXPR возвращает true.

Пример:

	$var = 1;
	$var2 = 3 if $var > 0; # Результат: $var2 = 3

while EXPR - Модификатор "пока". Предложение выполняется пока EXPR = true

Пример:

	$var = 1;
	print $var++ while $var < 5; # Печать $var с инкрементом

Результат: 1234

until EXPR- Модификатор "до ". Предложение выполняется до тех пор пока EXPR = false

Пример:

	$var = 1;
	print $var++ until $var > 5; # Печать $var с инкрементом

Результат: 12345

unless EXPR - Модификатор "если не" . Обратный к if. Выражение выполняется если EXPR = false.

Пример:

	$var = 1;
	print $var++ unless $var > 5; # Печать $var с инкрементом

Результат: 1

Сложные предложения.

Последовательность простых предложений, ограниченная функциональными ограничителями, называется блоком. В Perl это может быть целый файл, последовательность предложений в операторе eval{} или чаще всего это множество простых предложений, ограниченных круглыми скобками '{}'.

Существуют следующие виды сложных предложений:

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

if (EXPR) BLOCK - Вычисляется логическое выражение EXPR и если true блок выполняется.
Пример:

	$var =1;
	if ($var == 1)
	   { print $var,"\n";
	   }

Результат: 1

if (EXPR) BLOCK else BLOCK2 - Если EXPR=true выполняется BLOCK иначе BLOCK2.
Пример:

	$var =2;
	if ($var == 1)
	   { print "\$var = 1\n";
	   }
	else
	   { print "\$var не равно 1\n";
	   }

Результат: $var не равно 1

if (EXPR1) BLOCK1 elsif (EXPR2) BLOCK2 ... else BLOCK - Если EXPR1=true выполняется BLOCK1 иначе если EXPR2=true выполняется BLOCK2 иначе ... иначе BLOCK.
Пример:

	$var = 1;
	if ($var == 0)
	   { print "\$var = 0\n";
	   }
	elsif ($var == 1)
	   { print "\$var = 1\n";
	   }
	else
	   { print "Не известное \$var\n";
	   }

Результат: $var = 1

Цикл While

Цикл while выполняет BLOCK до тех пор пока EXPR = true. Метка LABEL не обязательна и состоит из идентификатора, завершающегося символом ':'. Метка необходима при использовании внутри блока цикла управляющих операторов next, last и redo. Если метка все же отсутствует, то эти операторы ссылаются к началу ближайшего цикла. Блок после continue выполняется всегда перед тем как вычисляется логическое выражение EXPR. Это подобно EXPR3 в предложении for, поэтому в этом блоке удобно изменять счетчики и флаги цикла даже если применяется оператор next.

Операторы управления циклом.

next - подобен continue в С. Переходит к началу текущего цикла т.е. повторяет итерацию.

Пример:

	M1:
	while ($i < 6)
	    {
	    ++$i;	# Увеличиваем счетчик на 1
	    next M1 if $i < 3; # Переходим в начало если $i < 3
	    ++$i;	# иначе увеличиваем счетчик еще раз на 1
	    }
	continue
	    {
	    print "$i "; # Печатаем $i
	    }

Результат: 1 2 4 6

last - подобен оператору break в языке С. Немедленно прерывает цикл. Блок continue пропускается.

Пример:

        M1:
        while ($i < 6)
            {
            ++$i;       # Увеличиваем счетчик на 1
            last M1 if $i > 3; # Выход из цикла если $i > 3
            ++$i;       # иначе увеличиваем счетчик еще раз на 1
            }
continue {
            print "$i "; # Печатаем $i
}

Результат: 2 4

redo - начать новый цикл не вычисляя EXPR и не выполняя continue блок.

Пример:

        M1:
        while ($i < 6)
            {
            ++$i;       # Увеличиваем счетчик на 1
            redo M1 if $i == 3; # Далее пропустить для $i = 3
            ++$i;       # иначе увеличиваем счетчик еще раз на 1
            }
continue {
            print "$i "; # Печатаем $i
}

Результат: 2 5 7

Цикл for.

LABEL for (EXPR1; EXPR2; EXPR3) BLOCK
Оператор for полностью аналогичен оператору for в С. В перед началом цикла выполняется EXPR1, если EXPR2 = true выполняется блок, затем выполняется EXPR3.

Пример:

	for ($i = 2; $i < 5; ++$i)
           {
           print $i, " ";
           }
        print "\nПосле цикла i = $i\n";

Результат:

Цикл foreach.

LABEL foreach VAR (LIST) BLOCK
Переменной VAR присваивается поочередно каждый элемент списка LIST и выполняется блок. Если VAR опущено, то элементы присваиваются встроенной переменной $_. Если в теле блока изменять значение VAR то это вызовет изменение и элементов списка т.к. VAR фактически указывает на текущий элемент списка. Вместо слова foreach можно писать просто for - это слова синонимы.

Пример:

        @месяц = ("январь","февраль","март");  # Создали массив
        foreach $i (@месяц)
            {
            print $i," ";       # Печать $i
            }

Результат: январь февраль март

Пример:

        @месяц = ("январь","февраль","март");  # Создали массив
        foreach $i (@месяц)
            {
            $i = uc($i); # Перевели в верхний регистр
            }
        print @месяц;

Результат: ЯНВАРЬФЕВРАЛЬМАРТ

Пример:

	for $i (3,5,7)
	    {
	    print "$i ";
	    }

Результат: 3 5 7

Блоки и оператор switch.

Блок не зависимо от того имеет он метку или нет семантически представляет собой цикл который выполняется один раз. Поэтому действие операторов цикла next, last, redo - аналогично описанному выше. Блоки удобны для построения switch (переключатель) структур. В Perl нет специального оператора switch подобного языку С поэтому вы сами можете создавать удобные для вас конструкции. Опыт автора показывает что для простоты написания лучше всего подходит конструкция вида if ... elsif ... else ... хотя можно сочинить и нечто подобное:

	SWITCH:
	{
	if ($i ==1 ) { .....; last SWITCH; }
	if ($i ==2 ) { .....; last SWITCH; }
	if ($i ==3 ) { .....; last SWITCH; }
	$default = 13;
	}

Выбирайте сами по своему вкусу.

Оператор goto.

В Perl существует оператор goto хотя где , как и когда его применять как говорил Ходжа Насреддин "Тонкий философский вопрос". Для начинающих программистов которым от так "нужен" я бы вообще посоветовал "забыть" о его существовании. Однако при создании больших производственных задач на последнем этапе особенно при отработке "отвальных" ошибочных ситуаций конечно goto нужен.

В Perl реализовано три формы goto. goto - метка, goto - выражение и goto - подпрограмма.

goto метка выполняет непосредственный переход на указанную метку.
goto - выражение Вычисляет имя метки и делает соответствующий переход. Например если мы хотим сделать переход на одну из трех меток "M1:", "M2:" или "M3:" в зависимости от значений переменной $i равной 0, 1 или 2 то это лучше сделать следующим образом:
	goto ("M1", "M2", "M3")[$i];

здесь $i используется как индекс массива указанного непосредственно в выражении.

goto подпрограмма довольно редкий случай т.к. всегда проще и надежней вызвать подпрограмму "естественным" образом.

POD операторы. Документирование программ.

В Perl реализован очень удобный механизм для написания документации в момент создания программы. Для этого применяются специальные POD операторы. Если в теле программы интерпретатор встречает оператор начинающийся с символа '=' например:

	= head Набор стандартных процедур

то пропускается все до слова '=cut'. Это удобно для включения длинных на несколько строк или страниц комментариев. Затем с помощью специальной программы pod можно отделить текст документации от текста программы.

[Назад] [Содержание] [Вперед]

Perl Технология программирования   Компьютерная графика Экономическая информатика   3GL   к 4GL

Знаете ли Вы, что такое мысленный эксперимент, gedanken experiment?
Это несуществующая практика, потусторонний опыт, воображение того, чего нет на самом деле. Мысленные эксперименты подобны снам наяву. Они рождают чудовищ. В отличие от физического эксперимента, который является опытной проверкой гипотез, "мысленный эксперимент" фокуснически подменяет экспериментальную проверку желаемыми, не проверенными на практике выводами, манипулируя логикообразными построениями, реально нарушающими саму логику путем использования недоказанных посылок в качестве доказанных, то есть путем подмены. Таким образом, основной задачей заявителей "мысленных экспериментов" является обман слушателя или читателя путем замены настоящего физического эксперимента его "куклой" - фиктивными рассуждениями под честное слово без самой физической проверки.
Заполнение физики воображаемыми, "мысленными экспериментами" привело к возникновению абсурдной сюрреалистической, спутанно-запутанной картины мира. Настоящий исследователь должен отличать такие "фантики" от настоящих ценностей.

Релятивисты и позитивисты утверждают, что "мысленный эксперимент" весьма полезный интрумент для проверки теорий (также возникающих в нашем уме) на непротиворечивость. В этом они обманывают людей, так как любая проверка может осуществляться только независимым от объекта проверки источником. Сам заявитель гипотезы не может быть проверкой своего же заявления, так как причина самого этого заявления есть отсутствие видимых для заявителя противоречий в заявлении.

Это мы видим на примере СТО и ОТО, превратившихся в своеобразный вид религии, управляющей наукой и общественным мнением. Никакое количество фактов, противоречащих им, не может преодолеть формулу Эйнштейна: "Если факт не соответствует теории - измените факт" (В другом варианте " - Факт не соответствует теории? - Тем хуже для факта").

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

Эксперимент на то и эксперимент, что он есть не изощрение мысли, а проверка мысли. Непротиворечивая внутри себя мысль не может сама себя проверить. Это доказано Куртом Гёделем.

Понятие "мысленный эксперимент" придумано специально спекулянтами - релятивистами для шулерской подмены реальной проверки мысли на практике (эксперимента) своим "честным словом". Подробнее читайте в FAQ по эфирной физике.

{DATA}
НОВОСТИ ФОРУМА

Форум Рыцари теории эфира


Рыцари теории эфира
 10.11.2021 - 12:37: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
10.11.2021 - 12:36: СОВЕСТЬ - Conscience -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
10.11.2021 - 12:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от д.м.н. Александра Алексеевича Редько - Карим_Хайдаров.
10.11.2021 - 12:35: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ПРАВОСУДИЯ.НЕТ - Карим_Хайдаров.
10.11.2021 - 12:34: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вадима Глогера, США - Карим_Хайдаров.
10.11.2021 - 09:18: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> Волновая генетика Петра Гаряева, 5G-контроль и управление - Карим_Хайдаров.
10.11.2021 - 09:18: ЭКОЛОГИЯ - Ecology -> ЭКОЛОГИЯ ДЛЯ ВСЕХ - Карим_Хайдаров.
10.11.2021 - 09:16: ЭКОЛОГИЯ - Ecology -> ПРОБЛЕМЫ МЕДИЦИНЫ - Карим_Хайдаров.
10.11.2021 - 09:15: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Екатерины Коваленко - Карим_Хайдаров.
10.11.2021 - 09:13: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вильгельма Варкентина - Карим_Хайдаров.
Bourabai Research - Технологии XXI века Bourabai Research Institution