簡體   English   中英

Perl:初學者。 我應該使用哪種數據結構?

[英]Perl: Beginner. Which data structure should I use?

好的,不知道在哪里問這個,但我是一個初學者程序員,使用 Perl。 我需要創建一個數組的數組,但我不確定使用數組/哈希引用、哈希數組或 arrays 等的 hash 是否會更好。

我需要一組匹配項: @totalmatches

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

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

我需要將這些元素中的每一個推入@matches數組/哈希/引用,然后將該數組/哈希/引用推入@totalmatches數組。

基於搜索文件並根據滿足條件選擇字符串來找到匹配項。

問題

  1. 你會使用哪種數據結構?

  2. 你可以將一個數組推入另一個數組,就像你將一個元素推入一個數組一樣嗎? 這是一種有效的方法嗎?

  3. 您可以同時推送所有 6 個元素,還是必須進行 6 次單獨推送?

  4. 在使用 2-D 時,要循環使用,您會使用:

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

感謝您的任何建議。

你會使用哪種數據結構?

一組有序事物的數組。 一組命名事物的 hash。

你可以將一個數組推入另一個數組,就像你將一個元素推入一個數組一樣嗎? 這是一種有效的方法嗎?

如果您嘗試將數組 (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 ...
    }
}

不要將一個陣列推入另一個陣列。 列表只是相互連接成一個新列表。

使用參考列表。

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

你會使用哪種數據結構?

一個數組...我無法真正證明該選擇的合理性,但我無法想象如果您使用 hash,您會使用什么作為鍵。

你可以將一個數組推入另一個數組,就像你將一個元素推入一個數組一樣嗎? 這是一種有效的方法嗎?

事情是這樣的; 在 Perl 中,arrays 只能包含標量變量 - 以$開頭的變量。 就像是...

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

......不會工作。 您將不得不使用對數組的引用:

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

或同樣:

push(@matrix, \@row);

您可以同時推送所有 6 個元素,還是必須進行 6 次單獨推送?

如果你使用引用,你只需要推送一次......因為你不想連接 arrays (你需要一個數組數組)你沒有其他選擇;)

在使用 2-D 時,要循環使用,您會使用:

我會使用類似的東西:

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

Which data structure would you use?

一些基本的容器屬性:

  • 數組是有序標量的容器。

  • hash 是通過唯一鍵獲得的標量的容器(哈希中不能有重復的鍵)。 稍后添加的值的順序不再可用。

我會使用與 ZhangChn 提出的相同的結構。

每場比賽使用 hash。 然后可以通過描述性名稱而不是簡單的數字索引來訪問匹配的詳細信息。 $ref->{'chapternumber'}而不是$matches[0]

引用這些匿名哈希(它們是標量)並將它們推送到數組中以保持匹配的順序。

從數據結構中取消引用項目

  • 從數組中獲取一個項目,該項目是 hash 參考

  • 從 hash 參考中檢索您需要的任何匹配細節

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM