perl,从文件输入、数组输入或无输入的子例程调用中填充散列

perl, populating a hash from a subroutine call on file input, array input, or no input

我做了class如下:

package Tool;

sub new {

  my ( $class, %args ) = @ARG;

  my $self = bless {
  #hash reference  
    _ToolParameters => { }

  }, $class;

  return $self;

}

然后我想创建这个 class:

的一个实例
my $Object = Tool->new();

然后,我想从文本文件或数组中读取以填充散列并按如下方式调用它:

from an array:    $Object->ImportData(\@Arraylist);
from a textfile:  $Object->ImportData(textfile.csv);

在此函数 ImportData 中,我想从严格为 ID# 的数组列表中读取我的密钥,或者从 CSV 文件中,它严格为 ID# 的第一列或到能够手动插入值:

*我希望 ID# = 密钥。

我正在考虑默认为该键生成至少一个参数字段,并为其分配一个默认值 0。

基本上当我从这个列表中 return 时,我会得到 ikegami 早些时候建议的一些东西,比如:

$self->{_ToolParameters}{$ID#1}{test_parameter_1} = $value;
$self->{_ToolParameters}{$ID#2}{test_parameter_1} = $value;

如果我接受数组,输入如下:

@Arraylist = (key1 ,..., keyN);

因为这是一个更大程序的一部分,我计划 运行 每个键通过一系列 'X' 测试套件,我计划给这些测试套件命名 "parameterX", X 是测试套件的编号。我采用给定的第一个测试套件,所以我想要的输出应该是对象中的输出,默认情况下(在推送任何更多参数之前):

*the default value for the 'value' is zero, because I have not run the testsuite, I am just initializing the field

key1 -> first_test ->0
key2 -> first_test ->0
.
.
keyN ->     first_test ->            0
(key)  (test_parameter_1)  (value of test_parameter_1)

我希望这个 returned 到对象,这样我以后可以将更多测试传递到哈希中,例如我可以拥有:

key1 -> first_test -> 0
     -> second_test -> 0

同样,在文本文件中,我只关心代表键或 ID 的列。

我想我的困惑是如何可靠地进行此分配,以便我有一个包含可扩展值对列表的对象,但写出来帮助我解决了大部分问题。

这是我需要一些指导的地方。

sub ImportData{
 my $a = shift;

 if($a eq /*.csv$/i )
{ #textfile case

  my @get_first_col = some kind of column dump; #keys, probably a while loop

  foreach $key (@get_first_col)
  {
  push($self->{_ToolParameters}{$key}{test_parameter_1} = 0);
  }
}
elseif($a)
{ #array case - want to reliably check if we're handling an array
  foreach (@{a})
  {
  push($self->{_ToolParameters}{$_}{test_parameter_1} = 0);
  }
}
else
{#case of manual input
my $a = <STDIN>
push($self->{_ToolParameters}{$_}{test_parameter_1} = 0);
}

}

不清楚你想要什么。

生产

{
    key1 => {
        parameter1 => 0,
        parameter2 => 0,
    },
    key2 => {
        parameter1 => 0,
        parameter2 => 1,
    },
}

给出

my @rows = (
    [ 'key1', 0, 0 ],
    [ 'key2', 0, 1 ],
);

你想要

$self->{$key}{parameter1} = $parameter;
$self->{$key}{parameter2} = $parameter2;

$self->{_ToolParameters}{$key}{parameter1} = $parameter;
$self->{_ToolParameters}{$key}{parameter2} = $parameter2;