Получение ссылок на скаляры
Проблема
Требуется создать ссылку на скалярную величину и работать с ней.
Решение
Для создания ссылки на скалярную величину воспользуйтесь оператором \:
$scalar_ref = \$scalar; # Получение ссылки на именованный скаляр
Чтобы создать ссылку на анонимную скалярную величину (то есть скаляр, не являющийся переменной),
присвойте нужное значение через разыменование неопределенной переменной:
undef $anon_scalar_ref;
$$anon_scalar_ref = 15;
Ссылка на скалярную константу создается следующим образом:
$anon_scalar_ref = \15;
Разыменование выполняется конструкцией ${...}:
print ${ $scalar_ref }; # Разыменовать
${ $scalar_ref } = "string"; # Изменить значение субъекта
Комментарий
Если вам понадобилось создать много новых анонимных скаляров, воспользуйтесь функцией,
возвращающей ссылку на лексическую переменную вне области действия:
sub new_anon_scalar {
my $temp;
return \$temp;
}
Perl почти никогда не выполняет косвенного разыменования. Исключение составляют ссылки
на файловые манипуляторы, программные ссылки на
sort и ссылочный аргумент функции bless.
Из-за этого для разыменования скалярной переменной следует снабдить ее префиксом $, чтобы
получить все ее содержимое:
$sref = new_anon_scalar();
$$sref = 3;
print "Three = $$sref\n";
@array_o_srefs = ( new_anon_scalar(), new_anon_scalar() );
$ {$array [0] } = 6.02e23;
$ {$array [1] } = "avocado";
print "\@array contains : ", join (",", map {$$_} @array), "\n";
Обратите внимание на фигурные скобки вокруг $аrrау[0] и $аrrау[1]. Если бы мы
попытались ограничиться простым $$аrrау[0], то в процессе разыменования получили бы $аrrау->[0].
Переменная $аrrау интерпретировалась бы как ссылка на массив, поэтому в результате был бы
возвращен элемент с нулевым индексом.
Приведем другие примеры, в которых фигурные скобки необязательны:
$var = uptime; # $var содержит текст
$vref = \$var; # $vref "указывает на" $var
if ($$vref = ~/load/) {} # Косвенное обращение к $var
chomp $$vref; # Косвенное изменение $var
Как упоминалось во введении, для определения типа субъекта по ссылке применяется
встроенная функция ref. При вызове ref для ссылки на скаляр возвращается строка "SCALAR":
# Проверить, содержит ли $someref ссылку на скаляр
if (ref($someref) ne 'SCALAR') {
die "Expected a scalar reference, not $someref\n";
}
См. также
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|