Учебные материалы по математике | Perl — полулокальные переменные | Matematiku5
Вузы по математике Готовые работы по математике Как писать работы по математике Примеры решения задач по математике Решить задачу по математике online

Perl — полулокальные переменные


my($n,@values);

($n,@values)=@_;

В этом примере мы выделяем количество аргументов и элементы аргументов.

Можно так:

my($n,@values)=@_;

Необходимо, чтобы все операторы my были расположены в начале определения подпрограммы, то есть до того, как будут выполняться основные действия в ней.

Полулокальные переменные

Оператор local – еще один способ создания "частных" локальных переменных.

Различия между my и local:

1.  При my переменная доступна только в пределах своей подпрограммы. При local переменная доступна во всех подпрограммах, вызываемых из данной, т. е. локальные переменные доступны для функций, вызываемых из того блока, для которого эти функции объявлены.

2.  Оператор my можно использовать только для объявления простых скалярных переменных, переменных – массивов и хеш – переменных. Для local таких ограничений нет.

3.  С помощью my нельзя объявлять встроенные переменные, такие, как: $_,#1, и @ARGV, а при помощи local— можно.

Часто строку local $_;

помещают в начало любой подпрограммы. Это гарантирует:

—  сохранность предыдущего значения;

—  автоматическое восстановление при выходе из подпрограммы.

Но при my операции действуют быстрее и надежнее!

При использовании директивы компилятора use strict;

Все переменные должны быть объявлены через my, иначе программа не будет компилироваться. Такие директивы называются "прагмой".

Пример:

use strict;

my $a; # Здесь при my не надо записывать

# списком

my @b=qw(fred betty);

…………………………………………………

push @b, qw(wilma);

@c= sort @b; # Данная строка компилироваться не

# будет, так как переменная-массив @c

# не объявлена.

Определение контекста вызова функции

Для того, чтобы узнать, как была вызвана ваша функция – в скалярном или списковом контексте, нужно воспользоваться функцией wantarray(). Данная функция возвращает три разных значения в зависимости от контекста вызова текущей функции.

if wantarray ()

{

# Списковый контекст

}

elsif (define wantarray ())

{

# Скалярный контекст

}

else

{

# Неопределенный контекст

}

Для спискового контекста wantarray () возвращает true. Если возвращается ложное, но определенное значение, то функция используется в скалярном контексте. Если возвращается undef, то от функции вообще не требуется возвращенного значения.

Пример:

@many_things = (1,2,3,4,5);

$one_things = 10;

sub mysub

{

if ( wantarray() )

{

print "1: In list contextn";

return @many_things;

}

elsif ( defined wantarray() )

{

print "2: In scalar contextn";

return $one_things;

}

else

{

print "3: In void contextn";

return 0; # Ничего

}

}

print "Скалярный контекстn";

$a = mysub(); # Скалярный контекст

if (mysub()) {}; # Скалярный контекст

print "Списковый контекстn";

@a = mysub(); # Списковый контекст

print mysub(); # Списковый контекст

print "Неопределенный контекстn";

mysub(); # Неопределенный контекст

Возврат нескольких массивов или хешей

Как и при вызове, так и при возврате все аргументы объединяются в один длинный список. Поэтому в этом случае нужно возвращать ссылки на массивы или хеши. Например,

Sub funct

{ ………….

…………

return (@array,%hash);

}

Можно в этом случае напмсать и такой оператор:

return (@array,%hash);

Это будет тоже самое.

Тогда при вызове необходимо записывать следующий оператор присваивания:

($arr_r,$hash_r) = funct ();

Использоапние прототипов

По прототипу Perl определяет тип параметров подпрограммы. Поэтому часто используют для проверки правильности вызова подпрограммы. Например, чтобы вместо массива не передавался скаляр или другой тип.

Чтобы объявить прототип, нужно перечислить в необходимом порядке символы, соответствующие префиксам аргументов:

$ — для скаляров;

@ — для массива;

% — для хеща и так далее.

Причем в силу поглощения массивами или хешами прототипы @ или % могут быть только последними.

Можно с помощью точки с запятой отделить обязательные параметры от необязательных. Например объявляется следующая подпрограмма:

sub Name_subr ($$;$)

Тогда вызов этой подпрограммы может быть в виде:

Name_subr $arg1, $arg2, $arg3

или

Name_subr $arg1, $arg2

Таблица описания и вызовов подпрограмм при прототипах

Прототип

Вызов

sub имя ($)

имя $arg1;

sub имя ($$)

имя $arg1,$arg2;

sub имя ($$;$)

имя $arg1,$arg2;

имя $arg1,$arg2,$arg3;

sub имя (@)

имя $arg1,$arg2,… $argn;

sub имя (%)

имя $key1=>val1,$key2=>$val2;

имя $key1,val1,$key2,$val2;

sub имя ($@)

имя $arg,$arg1,$arg2;

sub имя ($%)

имя $arg,$key1=>val1,$key2,$val2;

sub имя (@)

имя (@array);

sub имя (%)

имя (%ref_hash);

sub имя (&)

имя неименованная подпрограмма

sub имя (*)

имя *arg1;

sub имя ()

имя

Например, при прототипе sub имя ($@) вызов будет иметь вид:

имя $arg1,@array;

То-есть, если Вы хотте, чтобы при вызове аргументы начинались с префикса @ или %, а не были списком скалярных аргументов, то нужно защитить эти символы знаком обратного слеша "". Но необходимо учитывать тот факт, что хотя во втором аргументе мы передаем массив, но в подпрограмму через него будет передаваться ссылка на этот массив.

Внимание! Проверки синтаксиса, задаваемого прототипом, не происходит, если подпрограмма была вызвана с префиксом &.

Значения по умолчанию

Так как подпрограмма может получать переменное число аргументов, то иногда требуется обеспечить значения некоторых аргументов по умолчанию. Для этого используется оператор логического "или" (||).

Оператор ||:

—  не вычисляет второй аргумент, если первый соответствует true:

—  он возвращает не логические значения true или false, а первый из двух аргументов, который не равен false.

Пример.

sub add

{

($val1,$val2) = @_;

$val2 ||= 1;

print "$val1 + $val2 = ". ($val1 + $val2);

}

Если при вызове подпрограммы не будет второго аргумента, то неопределенное значение будет соответствовать значению false, то скалярной величине $val2 будет присвоено значение 1.

Результаты работы:

add (2); => 2 + 1 = 3

add (3,8); => 3 + 8 + 11

Такой метод подстановки по умолчанию подразумевает, что в качестве второго аргумента не будет задано число ноль или пустая строка. Поэтому лучше делать проверку количества аргументов через $#_ – индекс последнего аргумента в массиве @_.

Пример.

sub add2 ($;$)

{

$val1 = shift @_;

if ($#_ > 0)

{

$val2 = shift @_;

}

else

{

$val2 =1;

}

print "$val1 + $val2 =". ($val1 + $val2);

}

Определение имени функции

Часто необходимо определить имя функции, работающей в настоящий момент. Это может пригодиться для сообщений об ощибке. Подпрограмма всегда может определить с помощью метапеременных:

__LINE__ — номер строки;

__FILE__ — имя файла;

__PACKAGE__ — имя пакета.

Однако нет метапеременной для определения имени текущей полпрограммы и нет метапеременной для определения места, откуда она была вызвана.

Для этой цели используется встроенная функция caller, которая в скалярном контексте возвращает имя пакета вызывающей подпрограммы, а в списковом = список с различной информацией.

Этой подпрограмме можно передать целое число, которое будет задавать уровень вложенности получаемой информации:

0 – ваша функция;

1 – функция, из которой была вазвана вашы подпрограмма и так далее.

Полный синтаксис обращения к функции caller:

($package,$filename,$line,$subr,$has_args,$wantarray)=caller ($i);

0 — $package – имя пакета, в котором был откомпилирован код

подпрограммы;

1 — $filename – имя файла, в котором был откомпилирован код

подпрограммы. При запуске из коммандной строки возвращается значение —e, а при чтении сценария из STDIN – значение – (дефис).

2 — $line — номер строки, из которой был вызвана данная

функция;

3 — $subr — имя функции данного кадра, включающее пакет

(main::функция). Для eval возвращается

"(eval)".

4 — $has_args – признак наличия аргументов при вызове функции;

5 — $wantarray — значение, возвращаемое функцией wantarray для

данного вызлва функции. Равно teue, false или

undef.

Пример вызова: $this_func = (caller(0))[3] ;

Наташа

Автор

Наташа — контент-маркетолог и блогер, но все это не мешает ей оставаться адекватным человеком. Верит во все цвета радуги и не верит в теорию всемирного заговора. Увлекается «нефрохиромантией» и тайно мечтает воссоздать дома Александрийскую библиотеку.

Распродажа дипломных

 Скидка 30% по промокоду Diplom2020