perl,通过对文件输入、数组输入或无输入的子例程调用填充哈希

perl,通过对文件输入、数组输入或无输入的子例程调用填充哈希,perl,class,hash,subroutine,Perl,Class,Hash,Subroutine,我的课程安排如下: package Tool; sub new { my ( $class, %args ) = @ARG; my $self = bless { #hash reference _ToolParameters => { } }, $class; return $self; } from an array: $Object->ImportData(\@Arraylist); from a textfile: $Ob

我的课程安排如下:

package Tool;

sub new {

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

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

  }, $class;

  return $self;

}
from an array:    $Object->ImportData(\@Arraylist);
from a textfile:  $Object->ImportData(textfile.csv);
@Arraylist = (key1 ,..., keyN);
然后我想创建这个类的一个实例:

my $Object = Tool->new();
然后,我想从文本文件或数组中读取以填充哈希,并按如下方式调用它:

package Tool;

sub new {

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

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

  }, $class;

  return $self;

}
from an array:    $Object->ImportData(\@Arraylist);
from a textfile:  $Object->ImportData(textfile.csv);
@Arraylist = (key1 ,..., keyN);
在这个函数ImportData中,我想从严格意义上是ID#的数组列表中读取我的键,或者从CSV文件中读取我的键,它严格意义上是ID#的第一列,或者能够手动插入值:

*我希望它的ID=钥匙

我还考虑在默认情况下为该键生成至少一个参数字段,并为其指定一个默认值0

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

$self->{_ToolParameters}{$ID#1}{test_parameter_1} = $value;
$self->{_ToolParameters}{$ID#2}{test_parameter_1} = $value;
如果我接受一个数组,输入如下:

package Tool;

sub new {

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

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

  }, $class;

  return $self;

}
from an array:    $Object->ImportData(\@Arraylist);
from a textfile:  $Object->ImportData(textfile.csv);
@Arraylist = (key1 ,..., keyN);
由于这是一个更大程序的一部分,我计划通过一系列的“X”测试套件来运行每个键,我计划将这些测试套件命名为“parameterX”,X是测试套件的编号。我采用给定的第一个测试套件,因此我期望的输出应该是对象中的输出,默认情况下(在按下任何其他参数之前):

我希望将其返回到对象,以便稍后可以将更多测试传递到哈希中,例如,我可以:

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);
}

}
子导入数据{
我的$a=班次;
如果($a eq/*.csv$/i)
{#textfile案例
我的@get_first_col=某种列转储;#键,可能需要一个while循环
foreach$key(@get\u first\u col)
{
push($self->{ToolParameters}{$key}{test_参数_1}=0);
}
}
埃尔塞伊夫(a美元)
{#数组案例-希望可靠地检查我们是否正在处理数组
foreach(@{a})
{
push($self->{u工具参数}{${u参数{u 1}=0);
}
}
其他的
{#手动输入的情况
我的$a=
push($self->{u工具参数}{${u参数{u 1}=0);
}
}

不清楚您想要什么

产生

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

你想要

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


你能展示你想要结束的数据结构吗?为什么不把对象的一个字段做成一个散列,映射到
$key
[$parameter,$parameter2]
?显示输入文本文件(一个简短的例子)@ikegami有,答案只需要一些真实的输入数据我看到你更新了你的问题,但你让它变得更加混乱(例如,你说你只有
$key
,但你想使用
$ID
$value
)。我重复:显示您的输入或这些输入的期望输出。我已经在回答中演示了如何做到这一点。当你这样做的时候,在评论中标记我,我会更新我的答案。@ikegami,我想我已经能够提供你所要求的,这是一个合理的方法吗?这就是我所认为的吗?接下来,我将在我的环境中运行一些测试用例来查看。这是如何做到的,但我相信,如果/当OP提供真实的输入数据时,它将被更新以反映它。将密钥作为ID很好,将密钥作为ID很好,然后为ID设置一个参数,如“test#one#passed”,然后将一个值设置为begin=0,但文本文件或输入将只提供ID,默认情况下,我将以“test_one_passed”开始,但稍后填充哈希,以便ID必须通过更多测试。不知道您的意思。查看我如何提供输入和所需输出?编辑您的问题以提供这些问题的正确版本。