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;
我做了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;