Pull to refresh

Comments 17

Простите, это Perl? Вы просто не указали язык, мне немного не понятно.
Да, извиняюсь, в спешке позабыл написать вступление =)
А я проглядел теги, они иногда в глаза не бросаются.
ух-ты, автору кто-то проговорился про хеши.
Надеюсь, про объекты никто не скажет…
1. Не забывайте, что переданный функции хэш можно рассматривать и как массив; в вашем случае это будет намного оправданней. Вам будет более чем достаточно (и даже без глобальных переменных)

my ( $sub, $param ) = @_;
&{ $sub }( $param );

2. Если уж приводите всё к хэшу — используйте возможности, которые он предоставляет. Незачем добавлять лишние массивы, вредит и читаемости кода, и производительности.
my %hash = @_ ;
for my $name ( keys %hash ) {
print "Hello, $name!\n" x ( $hash{$name} || 1 );
}

Однако, в общем случае подобные вещи стоит сводить всё же к массивам — это проще, быстрее и надёжнее.
Думаю, for лучше организовать так:
while(my($key,$value)=each(%hash))
В таком варианте нам внутри цикла не придётся вытаскивать каждый раз значение, а значит перлу не надо будет каждый раз делать поиск по хешу.
Тогда уж вынести объявление my за пределы while если оптимизировать :)

Кстати, не факт что так будет лучше… Я специально сравнивал — в некоторых случаях (на маленьких очень часто вызываемых функциях) быстрее залезти лишний раз в хэш, чем объявлять my переменные (а тем более в цикле).
Согласен с вами лишь отчасти. Если, к примеру, мы точно не знаем, сколько атрибутов и их «дополнительных значений» передается в функцию, то массивы использовать станет непросто. А так, да, естессна, массивы лучше.
Свести к массивам можно тогда, когда мы точно знаем сколько параметров нам передают. Ну или нам придется это считать и делать перебор массива через один элемент, что тоже весьма вредит читабельности кода.
Перл позволяет провести одни и те же действия кучей способов, в том числе и достаточно читабельные:
while ( ( $key, $value ) = splice @param, 0, 2 ) {
  print "$key = $value\n";
}

Здесь, в отличии от хэша, сохраняется порядок переданных параметров.
Мощный язык Perl, но местами слишком непонятный для языка высокого уровня ^^
Во-первых, я не совсем понял какую задачу вы решаете своим примером.

Во-вторых, использовать глобальные переменные не совсем гуд. Такой подход как у вас (с объявлением our во внешнем по отношению к функции блоке) обычно используется для создания персистентных переменных.

А в-третьих, второй пример вообще тривиальный и используется во многих модулях для вызова функций. И вообще, рекомендуется в литературе для оформления вызовов функций так как сильно повышает читабельность кода.
UFO just landed and posted this here
Да, пожалуй, пример не совсем удачен, но цель была не написать программу, повторяющую код сколько угодно раз. Я всего лишь поделился небольшой мыслью или еще одним способом решить задачу. Очень рад, что вас это навело на раздумья, приятно. Жаль, что раздумья немного не в ту сторону, но это и моя вина, как полагаю — неконкретная статья получилась =)
До конца не понял идею. Это попытка придумать шаблон инкапсуляции функций?
Да я, если честно, и сам уже не помню. По-моему, это какая-то изотерическая задача, из серии «вот еще, что можно сделать, если особо больше нечего»…
Sign up to leave a comment.

Articles