shoorick: (Default)
[personal profile] shoorick
Подумалось тут, что функции с вагоном аргументов лучше передавать этот вагон не списом, а хэшем. Особенно, если среди передаваемых значений много undef. Написал пример функции:
#!/usr/bin/perl -w

$\ = "\n";
print various('with', 'list');
print various({ 'second' => 'Hash', 'first' => 'mit' });

sub various	{
	my @ORDER = qw(first second);	# Порядок неименованных параметров
	my %arg = ();	# Хэш парметров
	if (ref $_[0] eq 'HASH')	{
		%arg = %{$_[0]};
	} # if
	else	{
		foreach (@ORDER)	{
			$arg{$_} = shift;
		} # foreach
	}
	return join(':', keys(%arg)) . '=>' . join(':', values(%arg));
} # sub various
Функцию можно запускать обоими способами, результат одинаков:
$ ./various.pl
first:second=>with:list
first:second=>mit:Hash
Весь вопрос, так ли надо писать подобные функции или есть более разумные варианты?

Date: 2007-09-13 12:56 pm (UTC)
From: [identity profile] yorool-gui.livejournal.com
Насколько я помню, многие библиотеки разбирают параметры именно так: берут из списка позиционные параметры, а если видят хеш, извлекают оттуда именованные. HTTP точно с с такими параметрами работает.

Более того, оператор => для этого и сделан, он позволяет не заключать хеш-ключ в кавычки: например так

my $req = HTTP::Request->new(GET => "http://bla-bla-bla");

Без кавычек

Date: 2007-09-13 03:21 pm (UTC)
From: [identity profile] shoorick.livejournal.com
Что без кавычек можно — знаю. Но возникает встречный вопрос: а ведь строки без кавычек — это barewords, которые (например, согласно Perl Best Practices / 4.13. Barewords) вроде как нежелательно использовать. Так?

Помнится, мне как-то [livejournal.com profile] sappa по этому поводу замечание делал...

Re: Без кавычек

Date: 2007-09-13 03:36 pm (UTC)
From: [identity profile] yorool-gui.livejournal.com
Про необходимость use strict и my я согласен. А насчет barewords - дело вкуса. Я их использовал только в контексте вызовов функций и всегда заглавными буквами, так что вероятность конфликта с именем функции минимальна. А читабельность кода от них все же улушается, в перле и так слишком дофига знаков препинания.

Re: Без кавычек

Date: 2007-09-13 04:25 pm (UTC)
From: [identity profile] yorool-gui.livejournal.com
Кстати сейчас проверил - вот такой код отлично компилируется:

use strict;

my %a = ( A => 'a', B => 'b' );
my @a = ( 1, 2, 3 );
my $a = 1;

print $a{A}.' '.$a{B}."\n";
print $a[$a]."\n";

А если написать

print $a[a]."\n";

то ругается на bareword. Так что я все таки правильно помнил, что работа со строками без кавычек - это именно свойство хеша, а не общая поддержка barewords.

Re: Без кавычек

Date: 2007-09-13 06:27 pm (UTC)
From: [identity profile] anspa.livejournal.com
да, в свое время я изматерился, когда наобъявлял констант и не мог их использовать в качестве ключей в хеше, потому что они не воспринимаются там как константы и не резольвятся. т.е. в ключи записываются имена констант вместо значений.

Profile

shoorick: (Default)
shoorick

December 2016

S M T W T F S
    1 23
45678910
11121314151617
18 19 2021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 21st, 2026 05:07 pm
Powered by Dreamwidth Studios