Perl: синтаксическая ошибка «) [«. нарезка массива

#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 очень мало надежды на то, что он сможет определить, когда a map не будет иметь побочных эффектов, и преобразовать его в lazy map , учтите, что Perl допускает переопределение amp;CORE::GLOBAL::ord , что может привести к вызовам ord побочного эффекта.