#arrays #perl #slice
#массивы #perl #фрагмент
Вопрос:
Я новичок в Perl и немного экспериментировал. У меня есть этот код:
use Digest::MD5 'md5';
use Data::Dumper::Perltidy;
my $data = "x";
my $digest = md5($data);
# print first 6 elements
print Dumper map(ord, split(//, $digest))[0..5];
Но это приводит к ошибке синтаксиса. Я помню, что у PHP были похожие проблемы, из-за чего они планировали исправить это в будущих выпусках. У Perl все еще есть эта проблема или это просто неправильный способ сделать это? Как было бы правильно?
Ответ №1:
Вам нужно заключить map
в скобки, чтобы нарезка работала, например:
print Dumper( ( map ord, split(//, $digest) )[0..5] );
Комментарии:
1. Это все еще приводит к сбою с синтаксической ошибкой? Вы уверены? Когда это было введено?
2. Упс, я виноват. Я также пропустил скобки для
Dumper
функции.
Ответ №2:
Вы пытаетесь применить нижний индекс к функции map, а не к ее значениям.
print Dumper ( map(ord, split(//, $a) ))[0 .. 5];
Будет делать то, что вы ожидаете. Обратите внимание на использование
знака для устранения двусмысленности.
Ответ №3:
В дополнение к другим рабочим ответам учтите, что вы ограничиваете результат map
оператора, когда вы могли бы получить те же результаты, ограничив разделение. Это позволит передавать меньше данных для сопоставления ord
и сэкономит вашей программе некоторую работу:
print Dumper map(ord, ( split(//, $digest) )[0..5] );
Но поскольку в split это встроено, его можно упростить до
print Dumper map(ord, split(//, $digest, 6) );
Комментарии:
1. Просто чтобы было абсолютно ясно:
map
в Perl не лениво? Существуют ли какие-либо отложенные функции?2. В Perl 5 выражение или блок, выполняемые
map
для каждого входного значения, могут содержать побочные эффекты. Чтобы гарантировать, что любые побочные эффекты остаются максимально детерминированнымиmap
, выполняется по порядку, последовательно для всех входных значений. У Perl очень мало надежды на то, что он сможет определить, когда amap
не будет иметь побочных эффектов, и преобразовать его в lazymap
, учтите, что Perl допускает переопределениеamp;CORE::GLOBAL::ord
, что может привести к вызовамord
побочного эффекта.