我想帮助您弄清楚如何将长数组添加到散列键值,如何将键值分配给数据将被操作的临时数组,而不是分配数组(或者我已经离开了)回到相同的哈希键。 我正在寻找的样本如下:
#!/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'};
使用临时数组的一些过程包括:
,而不是将值分配回哈希
%Hash{'1'} = @TempArray;
我发现很多帖子都没有多大帮助,因为他们没有谈论长阵列。
答案 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中以完全相同的方式处理。