Прототипы (prototypes).
Для краткого описания типа передаваемых подпрограмме параметров можно применять прототипы. В Perl существуют следующие прототипы:
Декларация | Пример вызова | sub mylink($$) | mylink $old, $new | sub myvec($$$) | myvec $var, $offset, 1 | sub myindex($$;$) | myindex &getstring, "substr" | sub myreverse(@) | myreverse $a, $b, $c | sub myjoin($@) | myjoin ":",$a,$b,$c | sub mypop(\@) | mypop @array | sub mysplice(\@$$@) | mysplice @array, @array, 0, @pushme | sub mykeys(\%) | mykeys %{$hashref} | sub myopen(*;$) | myopen HANDLE, $name | sub mypipe(**) | mypipe READHANDLE, WRITEHANDLE | sub mygrep(&@) | mygrep { /foo/ } $a, $b, $c | sub myrand($) | myrand 42 | sub mytime() | mytime |
Здесь:
- \"символ" - параметр с типом "символ"
- "@" или "%" - все оставшиеся параметры как список
- "$" - скаляр
- "&" - безымянная подпрограмма
- "*" - ссылка на таблицу имен
- ";" - разграничитель обязательных и не обязательных параметров.
Ссылка как параметр.
Иногда нужно в качестве параметра передать подпрограмме не значение элемента массива, а ссылку на него, чтобы подпрограмма могла изменить значение элемента. Для этого в Perl к имени переменной добавляется символ "*" Подобное выражение называют "type glob" так же как в Unix символом "*" обозначают "все возможные значения". Поэтому "*" для массива означает "все элементы массива". Для скаляров употреблять "*" не имеет смысла, т.к. они и так передаются ссылкой и вы можете изменять значение параметра, изменяя, например, переменную $_[0].
Переопределение встроенных функций.
Большинство встроенных функций Perl можно переопределить своими собственными. Обычно это делают для удобства совместимости Perl для разных платформ систем. Для этого нужно перечислить имена этих функций в виде:
use subs "функция1", "функция2" ....; и далее в модуле определить сами функции.
Автозагрузка.
Если вы попытаетесь вызвать несуществующую функцию, то Perl немедленно выдаст сообщение об ошибке. Но если вы определите подпрограмму с именем "AUTOLOAD", то она будет вызвана с теми же параметрами, а переменная $AUTOLOAD будет содержать имя несуществующей подпрограммы. Данный механизм очень удобен для средств отладки.
Предыдущий урок Следущий урок
1 2
8 8 8
| |