Как я узнаю, является ли значение переменной в Perl скаляром или массивом? - PullRequest
7 голосов
/ 08 ноября 2010

Скажите, у меня есть это:

my %hash;

$hash{"a"} = "abc";
$hash{"b"} = [1, 2, 3];

Как я могу позже выяснить, было ли то, что было сохранено, скаляром, как в "abc", или массивом, как в [1, 2, 3]?

Ответы [ 2 ]

14 голосов
/ 08 ноября 2010

Прежде всего, ваш пример ссылки на массив неверен - ваш $hash{"b"} в итоге получит скалярное значение : последний элемент списка, который вы предоставили (в данном случае 'c') .

Тем не менее, если вы действительно хотите увидеть, есть ли у вас скаляр или ссылка, используйте функцию ref:

my %hash;

$hash{"a"} = "abc";
$hash{"b"} = [qw/a b c/];

if (ref $hash{"b"} eq 'ARRAY') {
  print "it's an array reference!";
}

Docs

8 голосов
/ 08 ноября 2010

Во-первых, $hash{"b"} = qw/a b c/; будет хранить 'c' в $hash{"b"}, а не массив, вы могли иметь в виду $hash{"b"} = [ qw/a b c/ ];, который будет хранить ссылку на массив в $hash{"b"}. Это ключевой бит информации. Все, кроме скаляра, должно быть сохранено в качестве ссылки при назначении на скаляр. Существует функция с именем ref, которая сообщит вам информацию о ссылке, но она передаст вам имя класса объекта, если ссылка была благословлена. К счастью, есть другая функция с именем reftype, которая всегда возвращает тип структуры в Scalar::Util.

#!/usr/bin/perl

use strict;
use warnings;

use Scalar::Util qw/reftype/;

my $rs  = \4;
my $ra  = [1 .. 5];
my $rh  = { a => 1 };
my $obj = bless {}, "UNIVERSAL";

print "ref: ", ref($rs), " reftype: ", reftype($rs), "\n",
    "ref: ", ref($ra), " reftype: ", reftype($ra), "\n",
    "ref: ", ref($rh), " reftype: ", reftype($rh), "\n",
    "ref: ", ref($obj), " reftype: ", reftype($obj), "\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...