2013-06-26 2 views
0

Быстрый вопрос: Я хотел бы хранить следующие переменные в Hash:Perl: возможно ли Хэш хранить смешанные переменные?

my %hash1; 
my %hash2; 
my %hash3; 
my @array1; 
my @array2; 
my @array3; 

Конечный результат существо:

Hash 
    hash1Name 
      {key1=>val1,key2=>val2} 
    hash2Name 
      {key1=>val1,key2=>val2} 
    hash3Name 
      {key1=>val1,key2=>val2} 
    array1Name 
      [element1,element2,...] 
    array2Name 
      [element1,element2,...] 
    array3Name 
      [element1,element2,...] 

Почему я хочу сделать это: Ну это все сделано в функции (sub), поэтому хотите вернуть все данные в один хеш.

Возможно ли это?

Было бы лучше просто создать класс, который может содержать эти переменные?

Благодаря

ответ

3

Вы можете хранить любые скаляр внутри хэш или массив. Скаляры включают ссылки на массивы или хэши:

my $hash = { 
    hash1Name => \%hash1, 
    hash2Name => \%hash2, 
    hash3Name => \%hash3, 
    array1Name => \@array1, 
    array2Name => \@array2, 
    array3Name => \@array3, 
} 

Perl не имеет никакой системы типа, что бы получить на вашем пути, если вы хотите сделать это. Но вы, программист, теперь отвечаете за правильное обращение с содержимым хеша, независимо от типа. Если он обеспечивает более чистый дизайн, вы можете использовать OO. Но следует помнить, что

  1. Основной объект, как правило, будет осуществляться таким хэша в любом случае
  2. OO ради OO в unneccessarily усложняет код, когда основные структуры данных достаточно.
2

Да, это возможно, и наиболее легко сделать с помощью лексических переменных:

sub mysub { 
    my %hash1; 
    my %hash2; 
    my %hash3; 
    my @array1; 
    my @array2; 
    my @array3; 
    ... 
    my %all = (
     hash1 => \%hash1, 
     hash2 => \%hash2, 
     array1 => \@array1, 
     # etc 
    ); 
    return \%all; 
} 

Вы возвращают одно скалярное значение, которое является хэш-справочник, содержащий все данные.

1
my %Hash = (
    hash1Name => \%hash1, 
    hash2Name => \%hash2, 
    hash3Name => \%hash3, 
    array1Name => \@array1, 
    array2Name => \@array2, 
    array3Name => \@array3, 
); 

Но вы, вероятно, хотите ссылку на хэш:

my $Hash = { 
    hash1Name => \%hash1, 
    hash2Name => \%hash2, 
    hash3Name => \%hash3, 
    array1Name => \@array1, 
    array2Name => \@array2, 
    array3Name => \@array3, 
};