Шаг 7 - Подпрограммы.

Подпрограммой (процедурой) называется кусок программного кода, созданный для реализации конкретной задачи. Они дают возможность избегать повторного набора одних и тех же операторов. Вот к примеру:

 $i = 5+6;
 print "Результат $i\n";
 $i = 10+3;
 print "Результат $i\n ";
 $i = 6+1;
 print "Результат $i\n ";
Результат, как можно уже догадаться выглядит так:
 Результат 11
 Результат 13
 Результат 7
Как вы видите здесь, повторяются практически все операции, и меняются только слагаемые.

Её можно уменьшить, применяя подпрограммы, но для начала посмотрим, как они определяются.

Синтаксис:

 sub имя_подрограммы() #Если вашей подпрограмме не передаются параметры.
 { --БЛОК-- };
 sub имя_подрограммы(тип переменных)
 { --БЛОК-- };
Здесь под словом 'тип переменных' понимается тип переменных, служащих для передачи данных подпрограмме. Хотя данные можно и не передавать, тогда 'тип переменных' можно упустить.

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

Пример:

 sub AddingProc ( $$)
 {
   $i = $_[1] + $_[0];
   print " Результат $i \n "
 };
AddingProc(5,6);
AddingProc(10,3);
AddingProc(1,6);
Причем, как можно заметить, параметры программе передаются в массиве @_, где $_[0] и $_[1] являются его элементами. Здесь также присутствует описание передаваемых параметров, в данном случае это два скаляра, но могут и быть другие описания, например:
  • @ - массив
  • $@ - скаляр, массив;
  • @$% - массив, скаляр, хеш
таких сочетаний вы можете придумать сколько угодно. Хотя есть некоторые неудобства в передаче параметров через массив @_, так как допустим, у вас передаются переменные типа @$, то идет зависимость местонахождения скаляра от размера идущего передним массива, это можно показать на таком примере:
 sub TestProc( @$ )
 { print $_[3]; }
 TestProc(("Test","Hello", "simply"),"scalar ");
Результат:
	scalar

Ну здесь всё понятно, но если мы заделаем так:

 sub TestProc( @$ )
 { print $_[3]; }
 TestProc(("Test","Hello", "simply","array"),"scalar ");
То получим слово 'array', а поэтому если же вы будите пользоваться таким способом передачи данных в процедуру, тогда ставьте вперёд данные, размер которых известен, а только потом массивы, размер которых изменяется.

Можно так же передавать параметры через переменные, так как переменные описанные в главной программе считаются локальными, то есть значение этой переменной распространяется на все используемые подпрограммы. Так же предусмотрено использование не локальных, а переменных доступных только внутри блока. Это можно устроить с помощью функции my(список переменных), обратите внимание на то, что если у вас существуют локальные переменные с такими же именами, то они будут игнорироваться.

Приведем такой пример:

 sub TestProc()
 {
   my($var);
   print "$var";
 }
$var = 10;
TestProc();
Результата здесь ни какого не будет, переменная $var в подпрограмме это не $var в главной программе.


Предыдущий Шаг | Следующий Шаг | Оглавление

By Vasya Vazhesov.