Perl将数组分配给哈希,反之亦然

时间:2017-09-22 00:33:51

标签: arrays perl hash

我想帮助您弄清楚如何将长数组添加到散列键值,如何将键值分配给数据将被操作的临时数组,而不是分配数组(或者我已经离开了)回到相同的哈希键。 我正在寻找的样本如下:

#!/usr/bin/perl 
use strict;

use warnings FATAL => 'all';

我的数组只包含整数

my @Array1 = ['01', '02', '03', '04', '09', '10', '11', '12']; 
my @Array2 = ['05', '06', '07', '08', '03', '04', '09']; 
my @Array3 = ['09', '10', '11', '12', '02', '03', , '07', '08' ]; 
my @ArrayN = ['N', 'N', 'N', 'N'];

我的哈希,用整数标识的键(是否可能?)

my %Hash;

将数组分配给键值;

%Hash{'1'} = @Array1 (or $Array1); 
%Hash{'2'} = @Array2 (or $Array2); 
%Hash{'3'} = @Array3 (or $Array3);
%Hash{'N'} = @ArrayN (or $ArrayN);

将哈希键值分配给临时数组

my @TempArray = $Hash{'1'};

使用临时数组的一些过程包括:

  • (删除临时数组的第一个元素/项目,让我们说出来 numnber" 01"');
  • (检查数组是否具有especifc值,让我们说数字03和 09);
  • (从数组中删除特定值,让我们说出来 numnbers 03和09');
  • (检查数组中存在多少元素/项目);

,而不是将值分配回哈希

%Hash{'1'} = @TempArray;

我发现很多帖子都没有多大帮助,因为他们没有谈论长阵列。

2 个答案:

答案 0 :(得分:3)

通过在列表中使用方括号,您实际上创建了一个数组引用,这是一个标量。因此,您的作业应为:

my $Array1 = ['01', '02', '03', '04', '09', '10', '11', '12']; 
my $Array2 = ['05', '06', '07', '08', '03', '04', '09'];

接下来,在将这些引用分配为散列键时,必须使用$ sigil,因为您指的是散列值(标量)而不是散列本身。

$Hash{'1'} = $Array1; 
$Hash{'2'} = $Array2; 

现在,如果要将这些引用分配给数组变量,则必须取消引用它们:

my @TempArray = @{ $Hash{'1'} };

关于这些阵列的操作/检查列表:

删除第一项:

shift @TempArray;

检查某个值是否为数组的元素:

my $check = grep { $_ == $some_number } @TempArray;

$check将是返回的匹配数,因此如果你得到零匹配则评估为false);

从数组中删除特定元素(索引未知):

每次出现某个值?

@TempArray = grep { $_ != $some_number } @TempArray;

特定元素(不一定是第一个或最后一个)?需要知道偏移量。

splice @TempArray => $index;

检查数组的长度:

my $length = @TempArray;

(指列表上下文中的数组返回其长度)

答案 1 :(得分:1)

  

我的数组,只包含整数

实际上,您的数组包含字符串: - )

my @Array1 = ['01', '02', '03', '04', '09', '10', '11', '12']; 

这是你的第一个严重错误。数组是从列表初始化的 - 因此您需要圆括号(...),而不是方括号,[...]

你想要这个:

my @Array1 = ('01', '02', '03', '04', '09', '10', '11', '12'); 

或者,您可以使用原始的方括号。但他们会给你一个数组参考。引用是标量值,因此您将其存储在标量变量中。

my $Array1_ref = ['01', '02', '03', '04', '09', '10', '11', '12']; 
  

我的哈希,用整数标识的键(是否可能?)

好吧,哈希的键总是字符串。但那没关系。 Perl会将整数无缝转换为字符串。而且这里没有必要,因为你实际上使用的是字符串('1'),而不是整数(1)。

%Hash{'1'} = @Array1; 

这里有几个错误。散列中的值是标量。因此,您使用标量符号($,而非%)访问它们。当然,数组不是标量,因此您无法将其存储在哈希值中。但是,您可以在哈希值中存储数组引用(因为引用是标量值。

$Hash{'1'} = \@Array1; # use \ to get a reference

或者,如果你坚持使用[...]版本并将数组引用存储在$Array_ref中,那么你可以这样做:

$Hash{'1'} = $Array_ref;
  

将哈希键值分配给临时数组

哈希值是对数组的引用。因此,在将其存储在数组变量中之前,您需要取消引用

@Temp_Array = @{ $Hash{'1'} };
  

删除临时数组的第一个元素/项,假设numnber为“01”'

shift @Temp_Array;
  

检查数组是否有especifc值,假设数字03和09

if (grep { $_ eq '03' } @Temp_Array) {
  say "03 is in the array";
}
  

从数组中删除特定值,比如numnbers 03和09

@Temp_Array = grep { $_ ne '03' and $_ ne '09' } @Temp_Array;
  

检查数组中存在多少元素/项目

只需在标量表达式中评估数组。

$num_of_elements = @Temp_Array;
  

然后将值分配回哈希

再一次,你需要对数组采用引用

$Hash{'1'} = \@Temp_Array

值得指出的是,您不需要将数组复制到临时数组变量来操作它。我在上面的示例中使用@Temp_Array的任何地方,您可以将其替换为@{ $Hash{'1'} },并且您将直接在哈希内部操作数组。

shift @{ $Hash{'1'} }; # for example
  

我发现很多帖子都没有帮助,因为他们没有谈论长阵列。

这可能是因为长数组和短数组(以及中型数组)都在Perl中以完全相同的方式处理。