Задать вопрос
@artem78

Как использовать константу в качестве ключа хеша в perl?

В функцию нужно передать параметры для curl. Логично поместить их в хеш, но константы в качестве ключа perl интерпретирует как строку и ф-ция setopt вполне справедливо сообщает "Argument "CURLOPT_URL" isn't numeric in subroutine entry". Как быть?

use WWW::Curl::Easy;
use Data::Dumper;

my %opts = (
	CURLOPT_URL => 'http://wikipedia.org',
	CURLOPT_CONNECTTIMEOUT => 30
);

sub curl_func {
	my ($curlOptions) = @_;
	my $ch = new WWW::Curl::Easy();
	while (my ($key, $value) = each %$curlOptions) {
		$ch->setopt($key, $value);
	}

	# ....
}

curl_func(\%opts);
  • Вопрос задан
  • 2397 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Slipeer
@Slipeer
Перловые константы на самом деле - функции, возвращающие нужные значения.
Соответственно для вызова функции по имени:
use WWW::Curl;
use WWW::Curl::Easy;
use Data::Dumper;

my %opts = (
    CURLOPT_URL => 'http://wikipedia.org',
    CURLOPT_CONNECTTIMEOUT => 30
);

sub curl_func {
    my ($curlOptions) = @_;
    my $ch = new WWW::Curl::Easy();
    while (my ($key, $value) = each %$curlOptions) {
        $ch->setopt(&{$key}(), $value);
    }
    # ...
}

curl_func(\%opts);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Ptktysq
my %opts = (
    CURLOPT_URL() => 'http://wikipedia.org',
    CURLOPT_CONNECTTIMEOUT() => 30
);


И аналогично при использовании константы как ключа хеша:

$hash{MY_CONSTANT()} = 123;

В остальных случаях скобки не обязательны.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы