В языках программирования существуют глобальные и закрытые (private) переменные, которые объявляются директивой my (…). В $_, $1, @ARGV, не объявляются и доступны из любой точки программы. Если вы не используете директиву use strict (или use strict 'vars' ) и объявляете в программе переменные ( $a и т.д.), то эти переменные будут глобальными для данного пакета. Если вы употребили директиву use strict, вы должны будете объявлять эти переменные директивой our.
Переменные my имеют лексическую видимость и видны в минимальном блоке { … }, в котором находится директива my. (Это утверждение также относится к блоку кода Perl (?{…} ) внутри
В языке local. Например:
$_=1;
{ local $_=2;
print "$_\n";
}
print "$_\n";
На печать выведется
2 1
Внутри блока программа работает с копией переменной $_, которая имеет то же имя, а при выходе из блока эта копия уничтожается, и программе становится доступна переменная $_, которая существовала до входа в этот блок. Директива local иногда применяется в подпрограммах, хотя в них логичнее создавать внутренние переменные директивой my. Директива local не применяется к переменным, созданным директивой my.
При совпадении в операторах m/…/ и s/…/…/ изменяют значения специальные переменные
$` - текст перед совпадением всего $ - текст, с которым совпало все $' - текст после совпадения всего $1 - текст, совпавший с первой парой $2 - текст, совпавший со второй парой $99 - текст, совпавший с 99-й парой $+ - Содержимое ($1, $2, … ,$99) с максимальным номером (на момент использования переменной $+).$^N - Содержимое ($1, $2, … ,$99), соответствующей последней только что закрытой паре скобок (на момент использования переменной $^N ). (Эту переменную в отличие от $+ почему-то можно читать сразу после закрывающей @- - массив начальных индексов совпадений в целевом тексте. $-[0] соответствует переменной $, $-[1] - переменной $1, …, $-[99] - переменной $99.@+ - массив конечных индексов (т.е. индексов первого символа после совпадения) совпадений в целевом тексте. $+[0] соответствует переменной $, $+[1] - переменной $1, …, $+[99] - переменной $99.$^R - стоит немного особняком и допускает присваивание. Результат последней по времени исполняемой части встроенного кода, который расположен не в условии условной конструкции (? if then [ | else ] ).Все эти переменные кроме $^R предназначены только для чтения. Многие авторы по ошибке считают, что переменная $^R тоже только читается, но мы убедились в противоположном. Также они ошибаются, говоря, что вне
Все эти переменные изменяют свое значение только при успешном поиске, при неудачном они хранят последнее присвоенное значение.
Переменные $1, $2, …, $99 устанавливаются сразу после закрытия соответствующей скобки, поэтому их можно использовать во встроенном коде или динамических \1, \2, …, \99.) То же относится к переменным $+, $^N, @- и @+. Переменная $^R получает значение после завершения соответствующего встроенного кода
В случае применения g (gc) при каждой итерации значения этим переменным присваиваются заново. Поэтому в операторе подстановки эти переменные всегда соответствуют соответствующим фрагментам текста из последней итерации.
Теперь рассмотрим такой пример:
my $a=1; $_='a'; /(a)/; print "$1\n"; /(b)/; print "$1\n";
Будет напечатано
a a
Первое $1 получила значение a. Второе $1, которое осталось от первого
Теперь рассмотрим более интересный пример:
my $a=1;
$_='ab';
/(a)/;
print "$1\n";
if ($a)
{ /(b)/;
print "$1\n";
}
print "$1\n";
Будет напечатано
a b a
Во внешнем $1 получает значение a, в b. Затем при выходе из блока мы пытаемся использовать это последнее присвоенное значение. И тут нас поджидает сюрприз (не знаю, приятный или нет): вне блока переменная $1 опять имеет свое старое значение. Это может породить труднонаходимые ошибки в программе, если не позаботиться о сохранении необходимых специальных переменных в переменных my.
Дело в том, что специальные переменные, используемые в
$_='ab';
/(a)/;
print "$1\n";
subr();
print "$1\n";
sub subr()
{ /(b)/;
print "$1\n";
}
Напечатается
a b a
Мы видим, что при выходе из подпрограммы переменная $1 вернула себе старое значение, а значение, полученное ею в подпрограмме, потерялось. Это следствие концепции динамической видимости. К специальным переменным, которые не относятся к
$^N. Например, у нас есть объект
my $re=qr/<a\s+href="([^"]+)"/i;
Мы можем его использовать в коде
$_='<a href="http://www.intuit.ru">'; print $1 if /$re/;
И напечатается
http://www.intuit.ru
URL получается в переменной $1. Если объект $re входит кирпичиком в более крупное $1, а в другой $url и всегда сохранять в ней найденный URL, воспользовавшись тем, что переменная $^N является копией
my $url;
my $re=qr/<a\s+href="([^"]+)(?{$url=$^N})"/i;
$_='<a href="http://www.intuit.ru">';
print $url if /$re/;
Опять напечатается
http://www.intuit.ru
Подобный кирпичик $re может войти в здание более сложного
Перед применением
регулярного выражения специальные переменные $1, $+, $` и т.д., он просто создает копию целевого текста и эти переменные ссылаются на фрагменты текста в этой копии. Это экономит время, ведь не всегда эти переменные потом будут затребованы программистом.
Целевой текст может оказаться большим, и система вынуждена будет тратить время и память на его дублирование, хотя этот дубль может и не понадобиться. Если мы не используем
Будет, т.к. существуют еще переменные $`, $ и $'. $`, $ и $' называются "вредными". Кроме того, их применение замедляет работу программы.
Транслятор просматривает всю программу и все используемые ею модули на предмет наличия этих "вредных" переменных. И если он их не находит, то выпоняет оптимизацию программы: не создает копию целевого текста для English, не используют этих переменных.
"Вредные" переменные $`, $ и $' можно имитировать с помощью массивов @- и @+. (Предполагаем, что целевой текст находится в переменной $_ ):
$` соответствует substr($_, 0, $-[0])$ соответствует substr($_, $-[0], $+[0] - $-[0])$' соответствует substr($_, $+[0])В языках программирования существуют глобальные и закрытые (private) переменные, которые объявляются директивой my (…). В $_, $1, @ARGV, не объявляются и доступны из любой точки программы. Если вы не используете директиву use strict (или use strict 'vars' ) и объявляете в программе переменные ( $a и т.д.), то эти переменные будут глобальными для данного пакета. Если вы употребили директиву use strict, вы должны будете объявлять эти переменные директивой our.
Переменные my имеют лексическую видимость и видны в минимальном блоке { … }, в котором находится директива my. (Это утверждение также относится к блоку кода Perl (?{…} ) внутри
В языке local. Например:
$_=1;
{ local $_=2;
print "$_\n";
}
print "$_\n";
На печать выведется
2 1
Внутри блока программа работает с копией переменной $_, которая имеет то же имя, а при выходе из блока эта копия уничтожается, и программе становится доступна переменная $_, которая существовала до входа в этот блок. Директива local иногда применяется в подпрограммах, хотя в них логичнее создавать внутренние переменные директивой my. Директива local не применяется к переменным, созданным директивой my.
При совпадении в операторах m/…/ и s/…/…/ изменяют значения специальные переменные
$` - текст перед совпадением всего $ - текст, с которым совпало все $' - текст после совпадения всего $1 - текст, совпавший с первой парой $2 - текст, совпавший со второй парой $99 - текст, совпавший с 99-й парой $+ - Содержимое ($1, $2, … ,$99) с максимальным номером (на момент использования переменной $+).$^N - Содержимое ($1, $2, … ,$99), соответствующей последней только что закрытой паре скобок (на момент использования переменной $^N ). (Эту переменную в отличие от $+ почему-то можно читать сразу после закрывающей @- - массив начальных индексов совпадений в целевом тексте. $-[0] соответствует переменной $, $-[1] - переменной $1, …, $-[99] - переменной $99.@+ - массив конечных индексов (т.е. индексов первого символа после совпадения) совпадений в целевом тексте. $+[0] соответствует переменной $, $+[1] - переменной $1, …, $+[99] - переменной $99.$^R - стоит немного особняком и допускает присваивание. Результат последней по времени исполняемой части встроенного кода, который расположен не в условии условной конструкции (? if then [ | else ] ).Все эти переменные кроме $^R предназначены только для чтения. Многие авторы по ошибке считают, что переменная $^R тоже только читается, но мы убедились в противоположном. Также они ошибаются, говоря, что вне
Все эти переменные изменяют свое значение только при успешном поиске, при неудачном они хранят последнее присвоенное значение.
Переменные $1, $2, …, $99 устанавливаются сразу после закрытия соответствующей скобки, поэтому их можно использовать во встроенном коде или динамических \1, \2, …, \99.) То же относится к переменным $+, $^N, @- и @+. Переменная $^R получает значение после завершения соответствующего встроенного кода
В случае применения g (gc) при каждой итерации значения этим переменным присваиваются заново. Поэтому в операторе подстановки эти переменные всегда соответствуют соответствующим фрагментам текста из последней итерации.
Теперь рассмотрим такой пример:
my $a=1; $_='a'; /(a)/; print "$1\n"; /(b)/; print "$1\n";
Будет напечатано
a a
Первое $1 получила значение a. Второе $1, которое осталось от первого
Теперь рассмотрим более интересный пример:
my $a=1;
$_='ab';
/(a)/;
print "$1\n";
if ($a)
{ /(b)/;
print "$1\n";
}
print "$1\n";
Будет напечатано
a b a
Во внешнем $1 получает значение a, в b. Затем при выходе из блока мы пытаемся использовать это последнее присвоенное значение. И тут нас поджидает сюрприз (не знаю, приятный или нет): вне блока переменная $1 опять имеет свое старое значение. Это может породить труднонаходимые ошибки в программе, если не позаботиться о сохранении необходимых специальных переменных в переменных my.
Дело в том, что специальные переменные, используемые в
$_='ab';
/(a)/;
print "$1\n";
subr();
print "$1\n";
sub subr()
{ /(b)/;
print "$1\n";
}
Напечатается
a b a
Мы видим, что при выходе из подпрограммы переменная $1 вернула себе старое значение, а значение, полученное ею в подпрограмме, потерялось. Это следствие концепции динамической видимости. К специальным переменным, которые не относятся к
$^N. Например, у нас есть объект
my $re=qr/<a\s+href="([^"]+)"/i;
Мы можем его использовать в коде
$_='<a href="http://www.intuit.ru">'; print $1 if /$re/;
И напечатается
http://www.intuit.ru
URL получается в переменной $1. Если объект $re входит кирпичиком в более крупное $1, а в другой $url и всегда сохранять в ней найденный URL, воспользовавшись тем, что переменная $^N является копией
my $url;
my $re=qr/<a\s+href="([^"]+)(?{$url=$^N})"/i;
$_='<a href="http://www.intuit.ru">';
print $url if /$re/;
Опять напечатается
http://www.intuit.ru
Подобный кирпичик $re может войти в здание более сложного
Перед применением
регулярного выражения специальные переменные $1, $+, $` и т.д., он просто создает копию целевого текста и эти переменные ссылаются на фрагменты текста в этой копии. Это экономит время, ведь не всегда эти переменные потом будут затребованы программистом.
Целевой текст может оказаться большим, и система вынуждена будет тратить время и память на его дублирование, хотя этот дубль может и не понадобиться. Если мы не используем
Будет, т.к. существуют еще переменные $`, $ и $'. $`, $ и $' называются "вредными". Кроме того, их применение замедляет работу программы.
Транслятор просматривает всю программу и все используемые ею модули на предмет наличия этих "вредных" переменных. И если он их не находит, то выпоняет оптимизацию программы: не создает копию целевого текста для English, не используют этих переменных.
"Вредные" переменные $`, $ и $' можно имитировать с помощью массивов @- и @+. (Предполагаем, что целевой текст находится в переменной $_ ):
$` соответствует substr($_, 0, $-[0])$ соответствует substr($_, $-[0], $+[0] - $-[0])$' соответствует substr($_, $+[0])Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.