Оператор разбиения m/// с g в списковом контексте. Если этот оператор m/// возвращает все фрагменты текста, которые совпали с
@lines=split /^/m, $text;
вернет в массиве @lines заданный текст, разбитый на логические строки.
Замечу, что в ^ означает начало логической строки, даже если m не задан, поэтому оператор
@lines=split /^/, $text;
будет работать точно так же, как и предыдущий оператор с m. Но можно это неявное правило отменить:
@lines=split /(?-m)^/, $text;
Это будет эквивалентно оператору
@lines=split /\A/, $text;
На $ это неявное правило не распространяется.
В o, как и в обычных
Оператор
split [ совпадение [ , целевой текст [ , ограничение ] ]]
Список операндов при необходимости можно заключать в скобки. Третий операнд не обязателен. Если его значение равно нулю, то это эквивалентно тому, что он не задан.
Второй операнд также не обязателен, но в случае его отсутствия также должен отсутствовать и третий операнд. Не обязателен и первый операнд, оператор
split
эквивалентен вызову
split ' ', $_, 0
где первый операнд является строкой, состоящий из одного пробела. Этот вызов разобьет текст, находящийся в $_, по пробельным символам, при этом начальные и заключительные пустые элементы созданы не будут.
Специальный первый операнд // (пустое
print join '-',split //, 'abcde';
напечатает a-b-c-d-e.
Специальный операнд ' ' (строка из одного пробела), разбивает заданный текст по пропускам \s+, но при этом начальные (и конечные) пробельные символы игнорируются.
Например, оператор
print join '-',split ' ', ' a b c de ';
напечатает a-b-c-de, а оператор
print join '-',split m/\s+/, ' a b c de ';
напечатает -a-b-c-de. Как видим, первый оператор игнорирует начальные и конечные пробелы, а второй - только конечные.
Рассмотрим варианты для первого операндаоператора
Для i, x, s, m, o. Если вы хотите сгруппировать
Оператор $_.
Роль этого необязательного операнда в том, чтобы ограничить число фрагментов, на которые будет разбит заданный текст. Если этот операнд отсутствует, то ограничения нет. Например, оператор
print join '-', split ' ', ' a b c de ', 3;
напечатает
a-b-c de
После возврата двух элементов вернется остаток заданного текста. Если в результате текст разобьется на число частей, которое меньше заданного, то дополнительные элементы не создаются. Например:
print join '-', split ' ', ' a b c de ', 10;
Напечатается: a-b-c-de-. Мы видим, что в этой форме оператор split в отличие от случая, когда третий операнд отсутствует, начинает возвращать конечные пустые элементы.
Также можно ограничить количество возвращаемых значений, если в качестве приемника задать список:
($a,$b,$c) = split /$re/, $text;
После заполнения заданного количества полей split.
Если количество кусков текста меньше заявленного количества элементов списка, то оставшиеся элементы списка получат пустые значения.
Если между совпадениями для первого операнда нет текста (совпадения идут подряд), то на соответствующих местах возвращаются пустые элементы. Оператор
print join '-', split '=', 'a=b==c';
напечатает
a-b--c
В этом случае пустые элементы, расположенные в конце текста, не возвращаются.
Например, оператор
print join '-',split '=', '===a=b==c===';
напечатает
---a-b--c
Для получения этих пустых элементов надо использвать третий операнд. Проще всего его установить в -1 (или в большое положительное число), тогда вернутся все элементы, на которые разбит текст. Оператор
print join '-', split '=', '===a=b==c===', -1;
напечатает
---a-b--c---
Число -1 здесь эквивалентно бесконечно большому положительному числу.
Иногда бывает нужно получить только непустые элементы разбиения текста. Для этого перед оператором split можно поставить вызов функции grep с аргументом length:
print grep { length } split '=', '===a=b==c===', -1;
или вместо length можно подставить само возвращаемое в $_ split значение:
print grep $_, split '=', '===a=b==c===', -1;
Напечатается просто abc. К каждому элементу списка, возвращаемому оператором split, будет применена функция length. И если результат будет равен нулю, то этот элемент будет удален из данного списка.
Мы уже видели, что пустые фрагменты, совпавшие в начале текста, возвращаются. Но если совпадение было без поглощения текста, а чисто позиционным, то эти пустые фрагменты не возвращаются. Например, оператор
print join '-', split /(?=\w)/, "abcd";
напечатает a-b-c-d, хотя перед буквой a тоже было совпадение.
Обращаю ваше внимание, что оператор
split /^/m, $text;
вернет все логические строки, в том числе и пустые: ведь при совпадении с пустыми строками возвращаются элементы \n, которые сами не являются пустыми.
Оператор split не имеет побочных эффектов: он не изменяет $1, …, $`, $, $' и т.д. Существует лишь один побочный эффект, не связанный с @_, который также используется для передачи параметров функциям.
При применении директивы use warnings или параметра -w при запуске
#!/usr/bin/perl -w use strict; scalar split /(?=\w)/, "abcd"; print @_;
Напечатается
Use of implicit split to @_ is deprecated at z.pl line 4. abcd
Сказанное об отсутствии побочных эффектов не означает, что внутри
split /(\w)(?{ print "=$1=" })/, "abcd";
напечатает текст
=a==b==c==d=
Если в первом операнде оператора undef.
Пример:
print join '-', split /(\d+)/, 'a12b23c34d45e56', 3;
Напечатается
a-12-b-23-c34d45e56
т.е. числа, по которым разбивался текст, заносятся в результат, чередуясь с самими фрагментами, на которые был разбит исходный текст. Текст был разбит на три части.
Вот еще пример - HTML-текст разбивается на текст вне тегов и при этом возвращаются все теги:
$_=<<EOD; <b>жирный текст</b> обычный текст <i>курсив</i> <h1> заголовок </h1> обычный текст EOD print join '-', split /(<[^>]+>)/;
Будет напечатано:
-<b>-жирный текст-</b>- обычный текст -<i>-курсив-</i>- -<h1>- заголовок -</h1>- обычный текст
Оператор GET и POST, и записывает имена и значения переменных в ассоциативный хеш contents:
if ($ENV{'REQUEST_METHOD'} eq 'POST')
# Принимаем данные по методу POST
{ # Читаем переданные формой данные
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
# Разбиваем их на пары имя=значение
@pairs=split(//, $buffer);
foreach $pair (@pairs)
{ # Каждую пару разбиваем на имя и значение
($name,$value)=split(/=/,$pair);
# Заменяем плюсы на пробелы (браузеры кодируют пробелы плюсами)
$value =~ tr/+/ /;
# Заменяем 16-ные байты их значениями
$value =~ s/%([a-fA-F0-9][a-fA-f0-9])/pack("C",hex($1))/eg;
# Записываем результат в хеш
$contents{$name}=$value;
}
} elsif ($ENV{'REQUEST_METHOD'} eq 'GET')
# Принимаем данные по методу GET
{ @pairs=split(//, $ENV{QUERY_STRING});
foreach $pair (@pairs)
{ ($name,$value)=split(/=/,$pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-f0-9])/pack("C",hex($1))/eg;
$contents{$name}=$value;
}
}
print "Content-Type: text/html\n\n";
print '<html><body>OK</body></html>';
Эту программу можно сократить, т.к. в цикле производятся те же самые операции.
Функция grep является мощным инструментом для создания из списков подсписков по определенным критериям. Эта мощь обусловлена тем фактом, что данная функция может использовать grep имеет две разновидности вызова:
grep { блок команд } список
и
grep выражение, список
Эта функция в неявном цикле по всем элементам списка для каждого из них выполняет заданный блок команд или выражение. Причем при каждой итерации цикла во время выполнения блока команд или выражения переменная $_ является синонимом очередного элемента списка. В частности, присвоение этой переменной значения повлечет присвоение этого же значения соответствующему элементу списка. Функция в качестве результата возвращает подсписок, для которых вычисленное значение выражения/блока команд является истиной (отлично от нуля, пустой строки и т.д.). Например, код
open F, 'prog.pl';
print grep { !/^#|^\s*$/m } <F>;
close F;
распечатает все строки файла prog.pl, которые не начинаются с символа # и не содержат одни лишь пробельные символы.
Оператор разбиения m/// с g в списковом контексте. Если этот оператор m/// возвращает все фрагменты текста, которые совпали с
@lines=split /^/m, $text;
вернет в массиве @lines заданный текст, разбитый на логические строки.
Замечу, что в ^ означает начало логической строки, даже если m не задан, поэтому оператор
@lines=split /^/, $text;
будет работать точно так же, как и предыдущий оператор с m. Но можно это неявное правило отменить:
@lines=split /(?-m)^/, $text;
Это будет эквивалентно оператору
@lines=split /\A/, $text;
На $ это неявное правило не распространяется.
В o, как и в обычных
Оператор
split [ совпадение [ , целевой текст [ , ограничение ] ]]
Список операндов при необходимости можно заключать в скобки. Третий операнд не обязателен. Если его значение равно нулю, то это эквивалентно тому, что он не задан.
Второй операнд также не обязателен, но в случае его отсутствия также должен отсутствовать и третий операнд. Не обязателен и первый операнд, оператор
split
эквивалентен вызову
split ' ', $_, 0
где первый операнд является строкой, состоящий из одного пробела. Этот вызов разобьет текст, находящийся в $_, по пробельным символам, при этом начальные и заключительные пустые элементы созданы не будут.
Специальный первый операнд // (пустое
print join '-',split //, 'abcde';
напечатает a-b-c-d-e.
Специальный операнд ' ' (строка из одного пробела), разбивает заданный текст по пропускам \s+, но при этом начальные (и конечные) пробельные символы игнорируются.
Например, оператор
print join '-',split ' ', ' a b c de ';
напечатает a-b-c-de, а оператор
print join '-',split m/\s+/, ' a b c de ';
напечатает -a-b-c-de. Как видим, первый оператор игнорирует начальные и конечные пробелы, а второй - только конечные.
Рассмотрим варианты для первого операндаоператора
Для i, x, s, m, o. Если вы хотите сгруппировать
Оператор $_.
Роль этого необязательного операнда в том, чтобы ограничить число фрагментов, на которые будет разбит заданный текст. Если этот операнд отсутствует, то ограничения нет. Например, оператор
print join '-', split ' ', ' a b c de ', 3;
напечатает
a-b-c de
После возврата двух элементов вернется остаток заданного текста. Если в результате текст разобьется на число частей, которое меньше заданного, то дополнительные элементы не создаются. Например:
print join '-', split ' ', ' a b c de ', 10;
Напечатается: a-b-c-de-. Мы видим, что в этой форме оператор split в отличие от случая, когда третий операнд отсутствует, начинает возвращать конечные пустые элементы.
Также можно ограничить количество возвращаемых значений, если в качестве приемника задать список:
($a,$b,$c) = split /$re/, $text;
После заполнения заданного количества полей split.
Если количество кусков текста меньше заявленного количества элементов списка, то оставшиеся элементы списка получат пустые значения.
Если между совпадениями для первого операнда нет текста (совпадения идут подряд), то на соответствующих местах возвращаются пустые элементы. Оператор
print join '-', split '=', 'a=b==c';
напечатает
a-b--c
В этом случае пустые элементы, расположенные в конце текста, не возвращаются.
Например, оператор
print join '-',split '=', '===a=b==c===';
напечатает
---a-b--c
Для получения этих пустых элементов надо использвать третий операнд. Проще всего его установить в -1 (или в большое положительное число), тогда вернутся все элементы, на которые разбит текст. Оператор
print join '-', split '=', '===a=b==c===', -1;
напечатает
---a-b--c---
Число -1 здесь эквивалентно бесконечно большому положительному числу.
Иногда бывает нужно получить только непустые элементы разбиения текста. Для этого перед оператором split можно поставить вызов функции grep с аргументом length:
print grep { length } split '=', '===a=b==c===', -1;
или вместо length можно подставить само возвращаемое в $_ split значение:
print grep $_, split '=', '===a=b==c===', -1;
Напечатается просто abc. К каждому элементу списка, возвращаемому оператором split, будет применена функция length. И если результат будет равен нулю, то этот элемент будет удален из данного списка.
Мы уже видели, что пустые фрагменты, совпавшие в начале текста, возвращаются. Но если совпадение было без поглощения текста, а чисто позиционным, то эти пустые фрагменты не возвращаются. Например, оператор
print join '-', split /(?=\w)/, "abcd";
напечатает a-b-c-d, хотя перед буквой a тоже было совпадение.
Обращаю ваше внимание, что оператор
split /^/m, $text;
вернет все логические строки, в том числе и пустые: ведь при совпадении с пустыми строками возвращаются элементы \n, которые сами не являются пустыми.
Оператор split не имеет побочных эффектов: он не изменяет $1, …, $`, $, $' и т.д. Существует лишь один побочный эффект, не связанный с @_, который также используется для передачи параметров функциям.
При применении директивы use warnings или параметра -w при запуске
#!/usr/bin/perl -w use strict; scalar split /(?=\w)/, "abcd"; print @_;
Напечатается
Use of implicit split to @_ is deprecated at z.pl line 4. abcd
Сказанное об отсутствии побочных эффектов не означает, что внутри
split /(\w)(?{ print "=$1=" })/, "abcd";
напечатает текст
=a==b==c==d=
Если в первом операнде оператора undef.
Пример:
print join '-', split /(\d+)/, 'a12b23c34d45e56', 3;
Напечатается
a-12-b-23-c34d45e56
т.е. числа, по которым разбивался текст, заносятся в результат, чередуясь с самими фрагментами, на которые был разбит исходный текст. Текст был разбит на три части.
Вот еще пример - HTML-текст разбивается на текст вне тегов и при этом возвращаются все теги:
$_=<<EOD; <b>жирный текст</b> обычный текст <i>курсив</i> <h1> заголовок </h1> обычный текст EOD print join '-', split /(<[^>]+>)/;
Будет напечатано:
-<b>-жирный текст-</b>- обычный текст -<i>-курсив-</i>- -<h1>- заголовок -</h1>- обычный текст
Оператор GET и POST, и записывает имена и значения переменных в ассоциативный хеш contents:
if ($ENV{'REQUEST_METHOD'} eq 'POST')
# Принимаем данные по методу POST
{ # Читаем переданные формой данные
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
# Разбиваем их на пары имя=значение
@pairs=split(//, $buffer);
foreach $pair (@pairs)
{ # Каждую пару разбиваем на имя и значение
($name,$value)=split(/=/,$pair);
# Заменяем плюсы на пробелы (браузеры кодируют пробелы плюсами)
$value =~ tr/+/ /;
# Заменяем 16-ные байты их значениями
$value =~ s/%([a-fA-F0-9][a-fA-f0-9])/pack("C",hex($1))/eg;
# Записываем результат в хеш
$contents{$name}=$value;
}
} elsif ($ENV{'REQUEST_METHOD'} eq 'GET')
# Принимаем данные по методу GET
{ @pairs=split(//, $ENV{QUERY_STRING});
foreach $pair (@pairs)
{ ($name,$value)=split(/=/,$pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-f0-9])/pack("C",hex($1))/eg;
$contents{$name}=$value;
}
}
print "Content-Type: text/html\n\n";
print '<html><body>OK</body></html>';
Эту программу можно сократить, т.к. в цикле производятся те же самые операции.
Функция grep является мощным инструментом для создания из списков подсписков по определенным критериям. Эта мощь обусловлена тем фактом, что данная функция может использовать grep имеет две разновидности вызова:
grep { блок команд } список
и
grep выражение, список
Эта функция в неявном цикле по всем элементам списка для каждого из них выполняет заданный блок команд или выражение. Причем при каждой итерации цикла во время выполнения блока команд или выражения переменная $_ является синонимом очередного элемента списка. В частности, присвоение этой переменной значения повлечет присвоение этого же значения соответствующему элементу списка. Функция в качестве результата возвращает подсписок, для которых вычисленное значение выражения/блока команд является истиной (отлично от нуля, пустой строки и т.д.). Например, код
open F, 'prog.pl';
print grep { !/^#|^\s*$/m } <F>;
close F;
распечатает все строки файла prog.pl, которые не начинаются с символа # и не содержат одни лишь пробельные символы.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.