Используйте ссылки на структуры данных чаще - PullRequest
5 голосов
/ 12 февраля 2011

Я читал некоторые дельта-файлы perl513 * и видел некоторые новые функции, появившиеся в Perl 5.14. Начиная с Perl 5.13.7, многие функции массива / хеша будут работать с ссылками на массивы / хэши . Хотя это, вероятно, рассматривается в основном как синтаксический сахар, или Perl делает то, что вы ожидаете, интересно, изменит ли это парадигму объявления структур данных в Perl? Учитывая известное предостережение о том, что оно нарушает совместимость с более ранним Perl, каковы будут аргументы за и против использования анонимных структур в первую очередь?

Например:

#!/usr/bin/env perl

use strict;
use warnings;

use 5.13.7;

my $hashref = {
  english => 'hello',
  spanish => 'hola',
  french => 'bon jour'
};

foreach my $greeting (keys $hashref) {
  say $hashref->{$greeting}; #use say since we need a later version anyway
}

, а не более традиционный способ использования именованного хэша (%hash).

P.S. Если это усиливается, я могу перейти на CW, но мне любопытно услышать некоторые перспективы.

Ответы [ 3 ]

4 голосов
/ 13 февраля 2011

Возможность использовать определенные массивы и хеш-функции в ссылках является просто синтаксическим сахаром и не должна влиять на работу с множественными структурами первого уровня.Для этого есть несколько причин:

задано my $array = [1 .. 10]

  • Функции обработки списка, такие как map, grep, sort, reverse, print, say, printf и многим другим по-прежнему необходимо пройти надлежащие списки, поэтому это означает использование @$array против более простого @array с этими функциями.

  • Циклу for/foreach необходимо передать список, требующий @$array

  • $array всегда true, чтобы определить длину, которую нужно записать @$array

    while ($array)  { infinite loop }
    while (@$array) { what you probably wanted }
    while (@array)  { no room for error here }
    
  • создание сценария реального @array, так как $array[$idx] незначительно быстрее (~ 15%), чем $array->[$idx], поскольку разыменование не требуется при каждом доступе.Разница с хэшами меньше, около 3%, из-за издержек функции хеширования.

По сути, при переходе ко всем ссылкам вы получаете другой набор функций, который необходимоиспользуйте разыменовывающие символы.Вместо этого воспользуйтесь преимуществами предварительной функции v5.13.7 для всего, что вы объявили для немедленного использования my @array; my %hash;, и используйте новые сочетания клавиш в областях, где вы использовали бы избыточные конструкции @{ ... } или %{ ... } с применимыми функциями.

1 голос
/ 13 февраля 2011

Хороший синтаксический сахар важен.Сам Perl является «единственным» синтаксическим сахаром над C, который содержит ассемблер сахара, который подслащивает машинный код.

Это не изменит способ использования моего верхнего уровня в вашем примере, но поможет уменьшить неловкий синтаксис, обнаруживаемый при использовании сложных структур, например "push @ ($ this -> {somekey}), $ stuff"становится "push $ this -> {somekey}, $ stuff".

1 голос
/ 12 февраля 2011

Я не верю, что это предстоящее изменение нарушит обратную совместимость.Теперь вы получаете сообщение об ошибке keys $hashref, с Perl 5.14 это будет работать.Таким образом, ни один текущий код не может использовать такую ​​функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...