2016-10-14 4 views
-1

Я сделал класс следующим образом:Perl, заселение хэш от вызова подпрограммы на входе файла, ввод массива или без ввода

package Tool; 

sub new { 

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

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

    }, $class; 

    return $self; 

} 

Затем я хочу, чтобы создать экземпляр этого класса:

my $Object = Tool->new(); 

тогда, я хотел бы читать из текстового файла или массива для заполнения хэш и вызвать его следующим образом:

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

в этом function ImportData, я хотел бы прочитать мой ключ из списка массивов, который будет строго соответствовать ID # или из файла CSV, это будет строго первый столбец, который является идентификатором # или может вставлять значения вручную :

* Я хочу, чтобы ID # = ключ.

Я имею в виду также генерации, по меньшей мере, одно поле параметров для этого ключа по умолчанию, и присвоение ему значение 0.

по умолчанию В принципе, когда я вернусь из этого списка я есть, что предложенное ранее Ikegami , как:

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

Если я принимать массив, вход следующим образом:

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

как это является частью более крупной программы, я планирую запустить каждый KE y через ряд наборов тестов 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) 

Я хочу, чтобы это возвращается к объекту такие, что впоследствии может пройти несколько тестов в хэш, таким образом, что, например, я могу иметь:

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

Аналогично, из текстового файла, мне все равно, о которых столбцы, которые представляют собой ключи, или идентификаторы.

Я предполагаю, что мое замешательство заключалось в том, как сделать это задание надежно таким, чтобы у меня был объект, содержащий список расширяемых значащих пар, но написание этого помогло мне решить большую часть этого.

Это то, где мне нужно руководствоваться.

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

} 
+0

Можете ли вы показать й e структура данных, в которую вы попадаете? – melpomene

+0

Почему бы не сделать одно из полей объекта хешем, который отображает '$ key' в' [$ parameter, $ parameter2] '? – melpomene

+0

отображает входной текстовый файл (краткий пример). @ikegami имеет это, ответ просто нуждается в некоторых реальных входных данных – stevieb

ответ

1

Непонятно, что вы хотите.

Для получения

{ 
    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; 
+0

вот как это сделать, но я уверен, что если/когда OP предоставляет реальные входные данные, это будет обновлено, чтобы отразить это. – stevieb

+0

Приятно взять ключ, чтобы быть ID # – Plexus

+0

Приятно взять ключ, чтобы быть ID # , тогда для ID # задан параметр типа "test_one_passed", а затем установите для него значение, чтобы начать = 0 , но текстовый файл или ввод будет содержать только ID #, и по умолчанию я бы начал с этого «test_one_passed», но позже заполнил хэш таким образом, чтобы идентификатор должен был пройти больше тестов. – Plexus

 Смежные вопросы

  • Нет связанных вопросов^_^