Русскоязычные документы веб-мастеру готовы к употреблению
https://partex-zavod.ru/catalog/komplektuyushchie_adr/ комплект грм для adr.
Где вы зарабатываете больше всего?
Яндекс.Директ
Google Adsens
Sape
Begun
Setlinks
Mainlinks
Blogun

Основы программирования.
Для написания любой программы важно понимать основы составления программ, знать как компьютер будет выполнять ваши приказы заточённые в виде команд в программу.
Составление программы есть не что иное, как разбиение всего процесса, который должен произойти на много мелких кусочков - команд. Например нам требуется сделать простейший калькулятор, который запрашивает 2 числа от пользователя, суммирует их и выдаёт результат, для этого нам потребуется нечто, что спросит эти числа, что сохранит, что просуммирует и что выдаст их пользователю.
Посмотрим на это как программер CGI скриптов:
1. Нам нужна форма с двумя полями ввода, куда пользователь введёт данные и нажатием на кнопку "SUBMIT" вызовет скрипт передав ему их.
2. Требуется скрипт, который считает данные из одного поля в первую переменную, из второго поля ввода во вторую переменную, просуммирует их, наконец создаст HTML`ку в которую пропишет результат и выдаст эту HTML в браузер пользователю.
Вот теперь вы наверняка подумали: "теперь придётся понимать как выдать HTML документ в браузер, и тому подобное..." - вы ошиблись, для этого существует сам сервер, вернее программа, которая называется сервером, которая управляет тем какие данные и как выдать при их запросе по адресу http://my.cool.address.ru/данные, а вам оставили свободу мысли!

Основы языка PERL.
Надеюсь с HTML вы достаточно знакомы, что бы суметь создать форму с двумя полями текстового ввода, и одной кнопкой "Отправить эти данные", если нет, загляните в доку по html - не зная html лезть в создание скриптов будет сложновато, т.к. думать две мысли и понимать два предмета в единицу времени непросто...
Однако вернёмся к PERL, сейчас я поведаю о тех немногочисленных командах и определениях, из которых сотканы большинство скриптов:

Комментарий (строка которая есть, но только для человека а не для языка):
# Всё что идёт после решеточки и есть комментарий...

Объявить (создать) переменную:
$Имя_переменной = значение;
Переменная может содержать как числовые значения, так и текстовые строки, perl сам разберётся что куда. Имя переменно может состоять только из английских символов и должно быть без пробелов. Текстовые строки надо заключать в кавычки, числовые рулят без кавычек, например:
$Parametr1 = 28; # число 28 $Beliberda = 'чисто строка'; # строка $rezultat = "вот твоё число: $chislo"; # это строка, но при работе скрипта вместо $chislo будет подставлено то, что находилось в переменной $chislo (это мог быть текст или другая строка).
Разница одинарных и двойных кавычек, в том, что в одинарных помещаются константы, а в двойных имена переменных будут заменены на их реальные значения. В случае если нам нужно внутри кавычек написать другие кавычки, то мы должны перед символом кавычек ставить символ экран - обратную косую \, например:
$Vantuz = "И было это слово \"процессор\", и заработал PC...";

Создать массив:
@Имя_массива = ("данные1", "данные2", ...);

Получить данные в переменную из элемента массива:
$Имя_переменной = Имя_массива[номер_позиции_в_масииве];

Сложение, вычитание, умножение, деление:
$Результат = $Переменная1 + $Переменная2;
$Результат = $Переменная1 - $Переменная2;
$Результат = $Переменная1 * $Переменная2;
$Результат = $Переменная1 / $Переменная2;

Условия (сравнение чисел):
Если равно:
if ($Переменная1 == Переменная2){действие которое надо выполнить если равно}
Если не равно:
if ($Переменная1 != Переменная2){действие которое надо выполнить}
Если 1 больше 2:
if ($Переменная1 > Переменная2){действие которое надо выполнить}
Если 1 меньше 2:
if ($Переменная1 < Переменная2){действие которое надо выполнить}
Если 1 больше или равно 2:
if ($Переменная1 >= Переменная2){действие которое надо выполнить}
Если 1 меньше или равно 2:
if ($Переменная1 <= Переменная2){действие которое надо выполнить}
Когда требуется выполнять действие не только при выполнении условия, но и при не выполнении, то добавляется блок else, например: if ($Перем1 == Перем2){действие которое надо выполнить если равно}else{действие которое надо выполнить если не равно}
Мало того можно сразу сравнивать нескольк значений и только если все они равны, то выполнять действие:
if ($Перем1 == Перем2 && $Перем3 == Перем4){действие которое надо выполнить если равно}
в таком написании символы && означают "это и это", а символы || означают "это или это", тоесть предыдущий пример звучит так: Если $Перем1 равна Перем2 и $Перем3 равна Перем4, то выполнить действие в фигурных скобках.

Условия (сравнение строк):
Если равны:
if ($Переменная1 eq Переменная2){действие которое надо выполнить если равны}
Если не равны:
if ($Переменная1 ne Переменная2){действие которое надо выполнить если равны}

Прокручиваем циклы:
for ($Переменная = Значение_начала; Условие; Действие_над_$Переменная){действие происходящее внутри цикла}
Например:
for ($n=0; $n < 50; $n=$n+1){$Prezervativ=$Konci[$n];}
А вот словесное пояснение цикла:
Переменная $n равна 0, тогда крутить цикл пока $n меньше 50, при каждой прокрутке цикла прибавить к $n единицу. Внутри цикла (при каждой прокрутке) в переменную $Prezervativ вытаскивать значение элемента $n из массива @Konci.
И ещё один вид цикла:
while ( Условие ){действие происходящее внутри цикла}
Цикл крутиться пока Условие выполняется, например условие может быть таким: $n == 1, тогда будем крутить цикл пока $n будет равно 1.
Когда цикл заканчивается начинают выполняться команды ниже его по тексту, до тех пор выполняются команды кторые внутри цикла.

А теперь самая заветная команда - вывод в пользователя:
print "Текст";
Выдаёт Текст в браузер (или на консоль пользователя, если пользователь запустил скрипт руками прямо изнутри сервера).

Этого небольшого набора команд нам хватит на первых порах для составления простых скриптов, а если не хватит, то буду пояснять по ходу (более подробно о командах можно прочитать в "Описание функций PERL (22kb)").

На чём пишут скрипты.
PERL скрипт, есть не что иное как обычный текстоый файл, а значит и писать его можно в обычном текстовом редакторе. Если мы пишем скрипты под использование на своём сайте, то сохраняйте их с расширением .cgi, если просто побаловаться на локальном компьютере где установлен Perl, то можно сохранять с расширением .pl
Правда есть тут и свои подводные камни, например такие как атрибуты фйла, код переноса строк, но это всё можно понять прочитав текстовик "Как правильно залить скрипты (1k)".

Создаём первый работоспособный скрипт.
Начнём своё программирование с того самого элементарно простого калькулятора, который берёт 2 числа, складывает их и возвращает результат. Для этого сначала представим полную схему работы скрипт-пользователь:
1. Пользователь вводит адрес скрипта в браузер.
2. Сервер выволняет скрипт расположенный по этому адресу.
3. Скрипт выдаёт HTML`ку с формой куда пользователь ведёт числа.
4. Пользователь видит форму, радуется, вводит числа, нажимает на кнопку "Результат".
5. По нажатию на кнопку "Результат" снова вызывается скрипт, но на этот раз ему передаются данные.
6. Скрипт раскладывает данные по переменным.
7. Переменные суммируются скриптом, и создаётся новая HTML`ка куда помещён результат.
8. сервер передаёт HTML`ку пользователю, пользователь радуется.
Всё это в виде скрипта, очень просто, но мне важно было что бы до тебя дошло, дошло как взаимодействует пользователь - сервер - скрипт, без понимания этого невозможно написать хоть что то полезное. Теперь, когда дошло, превратим сказанное в реальный скрипт, который прикола ради назовём "butor.cgi":

#!/usr/bin/perl

use CGI
$co = new CGI;

$Znachenie_1=$co->param('chislo1'); # Получить данные из поля1 в переменную 1
$Znachenie_2=$co->param('chislo2'); # Получить данные из поля2 в переменную 2

if ($Znachenie_1 == '' && $Znachenie_2 == ''){ # Если нет данных в переменных, то выдать форму
# Начинаем выдавать форму с HTML`кой
print "Content-Type: text/html\n\n"; # показать что мы начинаем вывод HTML
print "<html>";
print "<form action=\"http://адрес_твоего_серванта.ru/cgi-bin/butor.cgi\" method=\"POST\">";
print "<input type=text name=\"chislo1\">";
print "<input type=text name=\"chislo2\">";
print "<input type=submit value=\"Результат\">";
print "</form>";
print "</html>";
}else{ # Если данные в переменных, то сплюсовать и выдать результат
$Rezultat = $Znachenie_1 + $Znachenie_2; # Плюсуем
# Выдаём результат
print "Content-Type: text/html\n\n"; # показать что мы начинаем вывод HTML
print "<html>";
print "<h1>Вот результат: $Rezultat</h1>";
print "</html>";
}

Как стало заметно, я применил несколько магических команд в скрипте, одно из таких "#!/usr/bin/perl" - это есть не что иное, как то что указывает серверу, что в нашем файле лежат команды языка PERL, которые будут обрабатываться программой лежащей по внутреннему пути сервера "/usr/bin/perl" (у меня что на серванте хостера, что на домашнем linux, этот путь именно такой как я указал) ведь любой скрипт на Perl, просто текстовый файл и должен же быть способ чтобы понять что пред нами скрипт, а не текстовик и должно быть что то что выполнит эти команды. Ещё пара из таких странных команд, это "use CGI" и "$co = new CGI;", команды эти подключают к нашему скрипту модуль CGI (другой скрипт, который написал мудрый дяденька), и дают нам доступ к функциям которые находятся в его потрохах. Процесс этот полезный и сложный, полностью его пояснять в этой статье лишнее.

Работаем с файлами и делаем счётчик.
Если всё то что изложено выше уже понято, то пришло время углубиться в Perl, и поработать с файлами, создать не только работоспособное, но и полезное - счётчик посещений. Однако, сначала рассмотрим команды которые нужны для работы с файлом:

Открыть файл (на чтение):
open(Имя_потока, "<Имя_файла");

Открыть файл (на запись):
open(Имя_потока, ">Имя_файла");

Открыть файл (на чтение и запись):
open(Имя_потока, "+<Имя_файла");

Прочитать данные из файла в переменную:
$Переменная = <Имя_потока>;

Записать данные из переменной в файл:
print Имя_потока $Переменная;

Закрыть файл:
close (Имя_потока);

Записывать и читать можно не только переменные состоящие из одной строки, можно работать и с массивами, тогда любой текст будет разбит построчно на элементы массива, тоесть текст:
Петя дрючил Машу
но внезапно
после выполнения команды @Массив = <Имя_потока>; создаст массив вида:
@Массив = ("Петя дрючил Машу", "но внезапно");

Имеются и другие команды работы с файлами, например блокировка открытого файла, и перемещение начала чтения по файлу, однако блокировка не работает под Win, а у меня нет желания выдавать тебе сходу то, что может не заработать. Если приспичит, всегда сможешь найти описание этих команд в документации, или поисковике, однако команды я назову:
Блокировать файл/ждать разблокировки если уже заблокирован:
flock (Имя_потока, 2);
Разблокировка наступает как только выполняется команды закрыть файл "close (Имя_потока);".

Установить точку работы с файлом:
seek (Имя_потока, Позиция,Отсчёт);
Где Отсчёт равен 0 - от начала, 1 - от текущего положения, 2 - от конца файла, например, установить точку работы на начало файла:
seek (Имя_потока, 0,0);
На конец файла:
seek (Имя_потока, 0,2);

Блокировать файлы нужно, в том случае, когда много пользователей обращаются к скрипту, а скрипт постоянно меняет данные ибо не ровен час, когда два пользователя одновременно вызовут скрипт, две копии скрипта одновременно изменят данные, в итоге один из пользователей увидит на экране шнягу. А для счётчика это не принципиально...
Всё, пришло время делать счётчик! Так сделаем его, сделаем:

#!/usr/bin/perl

$Count_data_file='file.txt'; # Имя файла в котором лежит циферка насчитанного

open(yo_potok, "+<$Count_data_file"); # открыть файл счетчика на чтение и запись
$CounT=<yo_potok>; # переменная будет теперь содержать данные из файла
chomp ($CounT); # очистить переменную от символа перевода каретки (на всякий пожарный ;-)
$CounT = $CounT + 1; # переменная = переменная + 1
if ($CounT > 9999998) {$CounT=0;} # если переменная больше чем 9999998 то обнулить
truncate ($Count_data_file, 0); #Обнулить содержимое файла
print yo_potok $CounT; # записать данные из переменной в файл
close (yo_potok); # закрыть файл

print "Content-Type: text/html\n\n"; # показать что мы начинаем вывод HTML
print "<html><body>\n"; # тело HTML
print "$CounT\n"; # Вывести текущее состояние счетчика
print "</body></html>\n"; # завершить тело HTML

Теперь остаётся только создать в том каталоге где лежит скрипт, файл "file.txt", написать туда циферку 0 в текстовом редакторе, вызвать скрипт, и увидеть в том файле циферку 1 :-)
Но, тебе не кажется что тут чего то не хватает? Ты скажешь, нафига мне нужен счётчик на скрипт которого надо зайти, он покажет тебе текстом, сколько уже посетителей было, а иначе он вообще не считает... Тебе наверно хочется просто вставить в свою страницу обычный тег <img src="http://мойсервант.ru/cgi-bin/count.cgi">, и пусть оно само считает, само вызывается как картинка и выдаёт картинку с циферками. Что бы выдать нормальную картинку с циферками, картинку нужно создать, а пояснять как это делать, мне лом (и так уже 12 тысяч 940 раз нажал на кнопки), а вот как выдать всегда одинаковую картинку, это я могу (будет как на обычных счётчиках, только если запрещён показ статистики):

#!/usr/bin/perl

$Count_data_file='file.txt'; # Имя файла в котором лежит циферка насчитанного
$Count_data_gifack='file.gif'; # Имя файла в котором лежит GIF картинка

open(yo_potok, "+<$Count_data_file"); # открыть файл счетчика на чтение и запись
$CounT=<yo_potok>; # переменная будет теперь содержать данные из файла
chomp ($CounT); # очистить переменную от символа перевода каретки (на всякий пожарный ;-)
$CounT = $CounT + 1; # переменная = переменная + 1
if ($CounT > 9999998) {$CounT=0;} # если переменная больше чем 9999998 то обнулить
truncate ($Count_data_file, 0); #Обнулить содержимое файла
print yo_potok $CounT; # записать данные из переменной в файл
close (yo_potok); # закрыть файл

print "Content-Type: image/gif\n\n";
open yo_potokG,$Count_data_gifack;
print <yo_potokG>;
close yo_potokG;

Вот теперь можно положить рядом со скриптом картинку с именем файла "file.gif", и вызывать свой счётчик из страниц своего сайта тегом <img src="http://мойсервант.ru/cgi-bin/count.cgi">, и он будет считать !!!
На последок вариант первого счётчика с блокировкой файлов:

#!/usr/bin/perl

# Script C0dinG: 90hex [http://deface.ru/]
# Пример текстового счетчика (считает количество вызовов этого скрипта)
# для реального применения вызывайте его используя SSI

$count_data="file.txt"; # место расположения данных счетчика

open(data, "+<$count_data") or die "Error open"; # открыть файл счетчика на чтение и запись
flock (data, 2); # Блокировать файл/ждать разблокировки если уже заблокирован
seek (data, 0,0); # Установить точку работы в начало файла

$CounT=<data>; # переменная будет теперь содержать данные из файла
chomp ($CounT); # очистить переменную от символа перевода каретки (на всякий пожарный ;-)

++$CounT; # переменная = переменная + 1
if ($CounT > 9999998) {$CounT=0}; # если переменная больше чем 9999998 то обнулить

truncate ($count_data, 0); #Обнулить содержимое файла
seek (data, 0,0); # Установить точку записи в начало
print data $CounT; # записать данные из переменной в файл
close (data); # закрыть файл

print "Content-Type: text/html\n\n"; # показать что мы начинаем вывод HTML
print "<html><body>\n"; # тело HTML
print "$CounT\n"; # Вывести текущее состояние счетчика
print "</body></html>\n"; # завершить тело HTML

Вот пожалуй и всё на счёт самостоятельного изучения PERL для создания CGI работающих на WEB. В этой статье я старался максимально приблизится духовно к тому состоянию в котором прибывал когда впервые увидел Perl, и решил его понять, а по сему смею надеяться, что материал изложил доступно, и без лишнего. Естественно, что после его прочтения у тебя возникло множество вопросов, но я уверен с опытом и чтением документации которая выложена в этом разделе, вопросы твои найдут ответы.
Для людей у которых пожизненное "всё сделал как написано, скопировал код скриптов и вставил в текстовые файлы, потом изменил расширение на .cgi, но оно выдаёт ошибка 500 и всё тебе тут...".
С уважением, трогал пластик кнопок, 90hex.  

Комментарии