2010-06-07 32 views
0

這個簡單的Perl腳本正在將故事從數據庫轉換爲XML,但是這一節給我提出了一些問題。每個故事都會調用功能makeUrl,但需要確保不會創建重複的URL。簡單的perl數組函數不起作用

my @headlines =(); 
my $hlCount = 1; 
. 
. 
. 

sub makeUrl { 
    my $headline; 
    open(URLSOUT, '>>/var/mtkoan/harris/urls'); 

    $url = $_[0]; 
    print URLSOUT "Before: $url\n"; 
    $url =~ s/\x{90}//g; 
    $url =~ s/\s+$//g; 
    $url =~ s/^\s+//g; 
    $url =~ s/\s/_/g; 
    $url =~ s/\W//g; 

    push @headlines, $url; 
    foreach $headline (@headlines) { 
    if($headline eq $url) { 
     $url .= "_$hlCount"; 
     $hlCount++; 
    } 
    } 

    print URLSOUT "After: $url\n\n"; 
    print URLSOUT "Headline Array Dump:\n"; 
    print URLSOUT "@headlines\n"; 
    close URLSOUT; 
} 

當打印數組時,只顯示最後一個值。推不是追加到數組的末尾,我無法弄清楚!

+0

這裏是完整的腳本:http://pastebin.com/6SXe5ZSd – mtkoan 2010-06-07 17:12:16

+2

OOF,開關。那件事可能會引起討厭的問題。考慮重寫使用給定/何時(如果你是5.10或更新)或否則/如果/別人。開關看起來很漂亮;它不會真的讓程序更快。 – 2010-06-07 17:16:30

+0

我不明白爲什麼它不起作用,但使用散列代替數組會更有意義。那麼你就不需要遍歷數組來看看是否有一個愚蠢的行爲;它只是一個簡單的哈希查找。 – cjm 2010-06-07 17:17:53

回答

0

您可以檢查獨特性(並刪除從列表複製)的方式主要有兩種:

用哈希:

my %urls; 
    # construct your URL in the function... 
    $urls{$url}++; 

    # get all the (unique) URLs: 
    my @urls = keys %urls; 

隨着庫調用,在返回列表中的唯一值(見List::MoreUtils):

use List::MoreUtils 'uniq`; 
    @urls = uniq @urls;