Perl:初学者。我应该使用哪种数据结构?

时间:2011-06-09 20:35:08

标签: perl

好的,不知道在哪里问这个,但我是初学程序员,使用Perl。我需要创建一个数组的数组,但我不确定是否更好地使用数组/哈希引用,哈希数组或哈希数组等。

我需要一系列匹配项:@totalmatches

每个匹配包含6个元素(字符串):

@matches = ($chapternumber, $sentencenumber, $sentence, $grammar_relation, $argument1, $argument2)

我需要将每个元素推送到@matches数组/散列/引用中,然后将该数组/散列/引用推送到@totalmatches数组中。

根据搜索文件并根据符合条件选择字符串,找到匹配项。

问题

  1. 您会使用哪种数据结构?

  2. 您可以将数组推入另一个数组,就像将元素推入数组一样吗?这是一种有效的方法吗?

  3. 您可以同时推送所有6个元素,还是必须进行6次单独推送?

  4. 使用2-D时,要使用:

      

    foreach(@totalmatches){           foreach(@matches){              ...           }       }

  5. 感谢您的任何建议。

4 个答案:

答案 0 :(得分:6)

  

您将使用哪种数据结构?

有序集合的数组。一组命名事物的哈希。

  

您可以将数组推入另一个数组,就像将元素推入数组一样吗?这是一种有效的方法吗?

如果你试图将一个数组(1)推入一个数组(2),你最终会将1的所有元素推入2.这就是为什么你要推送一个数组ref。

  

你可以同时推动所有6个元素,还是必须进行6次单独推送?

查看perldoc -f push

push ARRAY,LIST

您可以推送一系列内容。

  

使用2-D时,要使用:

嵌套的foreach很好,但是这种语法不起作用。您必须访问正在处理的值。

for my $arrayref (@outer) {
    for my $item (@$arrayref) {
        $item ...
    }
}

答案 1 :(得分:3)

不要将一个数组推入另一个数组。 列表只是相互加入一个新列表。

使用参考列表。

#create an anonymous hash ref for each match
$one_match_ref = {
     chapternumber => $chapternumber_value, 
     sentencenumber => $sentencenumber_value, 
     sentence => $sentence_value,
     grammar_relation => $grammar_relation_value, 
     arg1 => $argument1, 
     arg2 => $argument2
};

# add the reference of match into array.
push @all_matches, $one_match_ref;

# list of keys of interest
@keys = qw(chapternumber sentencenumber sentence grammer_relation arg1 arg2);
# walk through all the matches.
foreach $ref (@all_matches) {
    foreach $key (@keys) {
        $val = $$ref{$key};

    }
    # or pick up some specific keys
    my $arg1 = $$ref{arg1};
}

答案 2 :(得分:2)

  

您将使用哪种数据结构?

一个数组......我无法证明这个选择是正确的,但我无法想象如果你使用哈希,你会用什么作为键。

  

您可以将数组推入另一个数组,就像将元素推入数组一样吗?这是一种有效的方法吗?

这就是事情;在Perl中,数组只能包含标量变量 - 以$开头的变量。有点像...

@matrix = ();
@row = ();
$arr[0] = @row; # FAIL!

......不会工作。您将不得不使用对数组的引用:

@matrix = ();
@row = ();
$arr[0] = \@row;

或同样地:

push(@matrix, \@row);
  

你可以同时推动所有6个元素,还是必须进行6次单独推送?

如果你使用引用,你只需要推送一次......因为你不想连接数组(你需要一个数组数组),你就没有其他选择;)

  

使用2-D时,要使用:

我会使用类似的东西:

for($i=0; $i<@matrix; $i++) {
    @row = @{$matrix[$i]}; # de-reference
    for($j=0; $j<@row; $j++) {
        print "| "$row[$j];
    }
    print "|\n";
}

答案 3 :(得分:2)

Which data structure would you use?

一些基本的容器属性:

  • 数组是有序标量的容器。

  • 哈希是通过唯一键获取的标量的容器(哈希中可能没有重复的键)。之后添加的值的顺序不再可用。

我会使用像ZhangChn提出的相同结构。

为每场比赛使用哈希值。 然后可以通过描述性名称而不是简单的数字索引来访问匹配的细节。即$ref->{'chapternumber'}而不是$matches[0]

引用这些匿名哈希(它们是标量)并将它们推入数组以保持匹配的顺序。

取消引用数据结构中的项目

  • 从数组中获取一个哈希引用项

  • 从哈希引用

  • 中检索所需的任何匹配详细信息