簡體   English   中英

新的Perl用戶:使用數組哈希

[英]New Perl user: using a hash of arrays

我正在做一個數據挖掘項目,其中一個perl腳本從SQL數據庫中獲取信息並進行解析。 數據由幾個時間戳組成。 我想查找在任何特定日期存在多少種特定類型的時間戳。 不幸的是,這是我的第一個perl腳本,涉及哈希和數組時,perl的性質使我相當困惑。

代碼段:

my %values=();#A hash of the total values of each type of data of each day.
#The key is the day, and each key stores an array of each of the values I need.
my @proposal;
#[drafted timestamp(0), submitted timestamp(1), attny approved timestamp(2),Organiziation approved timestamp(3), Other approval timestamp(4), Approved Timestamp(5)]
while(@proposal=$sqlresults->fetchrow_array()){
 #TODO: check to make sure proposal is valid
 #Increment the number of timestamps of each type on each particular date
 my $i;
for($i=0;$i<=5;$i++)
$values{$proposal[$i]}[$i]++;
#Update rolling average of daily 
#TODO: To check total load, increment total load on all dates between attourney approve date and accepted date
for($i=$proposal[1];$i<=$proposal[2];$i++)
 $values{$i}[6]++; 
}

我不斷在for循環中增加值的語法錯誤。 另外,考慮到我正在使用嚴格警告,Perl在散列中訪問它們時會自動創建正確值的數組,還是會遍地出界錯誤?

感謝您的幫助,扎克

錯誤:

for($i=0;$i<=5;$i++)
    $values{$proposal[$i]}[$i]++;
for($i=$proposal[1];$i<=$proposal[2];$i++)
    $values{$i}[6]++; 

Perl不支持裸循環/條件塊。 或更確切地說, 確實如此 ,但並非如此。 這可能在PHP中起作用,但在Perl中不起作用。 您將需要將它們包含在塊中:

for($i=0;$i<=5;$i++) {
    $values{$proposal[$i]}[$i]++;
}
for($i=$proposal[1];$i<=$proposal[2];$i++) {
    $values{$i}[6]++;
}

$values{$proposal[$i]}[$i]++;

由於Perl中的哈希只能在其中容納標量數據類型,因此為了將整個數組存儲在哈希中,我們將不得不通過引用來實現。 這是有關數組引用的快速教程:

my $arr_ref = [];               # empty array reference
my $arr_ref = [ 1, 2, 'foo', ]; # initialize with values
my $arr_ref = \@arr;            # reference an existing array;
                                # does not make copy, but provides a
                                # read-write handle to the array

$arr_ref->[0];                  # index the first (index 0) element of the array
@{$arr_ref}[ 0 .. 4 ];          # index elements number one through five (0-4) of the array
                                # through what's called an "array slice"

上面的代碼所做的是從哈希%values取出哈希鍵$proposal[$i]%values ,然后將其(標量)用作數組(不是數組)。

如前所述,您可以將其用作數組引用,但不能用作數組:

                    # v-- note the arrow
$values{$proposal[$i]}->[$i]++;

建議:

  • my $foo; for ($foo = 0; $foo <= 5; $foo++) my $foo; for ($foo = 0; $foo <= 5; $foo++)更容易寫為“ for my $foo (0 .. 5) ”或“ foreach my $foo (0 .. 5) ”。 本質上,這就是大多數人的做法。 值得注意的是forforeach是可互換的–這是偏好和易讀性的問題。

  • 出於可讀性考慮,請將代碼縮進多個空格。 一個好的經驗法則是四個空格或一個制表符。 St. Larry Wall在設計Perl時就想到了人們會說和寫的語言。

  • 我建議你研究的正確(正確的,在這里,意思是最有效的)的方式來寫for循環。 有跡象表明,可以加快程序的整體,如果他們有很多的長一些習慣for循環。 例如:

    • ++$foo$foo++更有效。 這源於內部:
      • $foo++遞增變量,從中減去1,然后返回結果,而
      • ++$foo遞增變量並返回它。 更少的操作=更快。
    • 小於等於的比較比普通小於的比較效率低。 同樣,這是由於計算機必須執行的操作數量所致。 for ($x=0; $x<=5; ++$x)的書寫方式與for ($x=0; $x<6; ++$x)更好。
  • Perl有一些很棒的循環控件。 有些功能(例如map )非常強大。

暫無
暫無

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

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