Подпрограммой (процедурой) называется кусок программного кода, созданный для реализации конкретной задачи. Они дают возможность избегать повторного набора одних и тех же операторов. Вот к примеру:
$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 в главной программе.