[英]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)
”。 本質上,這就是大多數人的做法。 值得注意的是for
和foreach
是可互換的–這是偏好和易讀性的問題。
出於可讀性考慮,請將代碼縮進多個空格。 一個好的經驗法則是四個空格或一個制表符。 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.