【问题标题】:Perl assign array to hash and vice-versaPerl 将数组分配给哈希,反之亦然
【发布时间】:2017-09-22 00:33:50
【问题描述】:

我希望得到您的帮助,以了解如何将长数组添加到哈希键值,如何将键值分配给将要操作数据的临时数组,而不是分配数组(或什么我已经离开)回到相同的哈希键。 我正在寻找的示例如下:

#!/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'};

一些带有临时数组的进程,包括:

  • (删除临时数组的第一个元素/项,假设 编号“01”');
  • (检查数组是否有特定值,比如数字 03 和 09);
  • (从数组中删除特定值,假设 数字 03 和 09');
  • (检查数组中有多少元素/项);

将值分配回哈希

%Hash{'1'} = @TempArray;

我发现很多帖子没有太大帮助,因为它们没有谈论长数组。

【问题讨论】:

  • (1) $array_reference = [ ... ]@array = ( ... ) (2) 哈希值是一个标量,所以前面需要$,并且必须分配一个reference一个数组(这是一个标量)。因此:$hash{'1'} = $array_reference$hash{'1'} = \@array,其中 \ 接受一个引用,这里是一个数组 (3) 取消引用该数组引用以获取一个数组 @TempArray = @{ $hash{'1'} }。最后:这个网站不是获取基本教程的好地方,而且这种问题明显是题外话。

标签: arrays perl hash


【解决方案1】:

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

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;

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

【讨论】:

  • 似乎下面的行正在获取数组大小而不是数组元素:(它在第 13 行:` my @TempArray = @{ $Hash{'1'} };` #Can '在 /bkp_local/MyCodes/chess/test.pl 第 13 行使用 "strict refs" 时不使用字符串 ("8") 作为 ARRAY 引用。
  • 如果没有看到您的其余代码,您似乎将 $Hash{'1'} 的值作为字符串而不是字符串的数组引用。您可能在某处缺少方括号。
【解决方案2】:

我的数组只包含整数

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

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

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

你想要这个:

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

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

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

我的哈希键由整数标识(有可能吗?)

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

%Hash{'1'} = @Array1; 

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

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

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

$Hash{'1'} = $Array_ref;

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

哈希值是对数组的引用。因此,您需要先取消引用它,然后再将其存储到数组变量中。

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

删除临时数组的第一个元素/项,比如说数字“01”'

shift @Temp_Array;

检查数组是否有特定的值,比如数字 03 和 09

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

从数组中删除特定的值,比如数字 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 中的处理方式完全相同。

【讨论】:

    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 2011-03-22
    • 2011-04-12
    相关资源
    最近更新 更多