2015-06-08 130 views
0

我的這段代碼的目標是淨化元素數組(URL的列表,其中一些包含特殊字符,如%),以便我最終可以將其與另一個URL文件進行比較並輸出哪些匹配。 URL的列表來自.csv文件,第一個字段是我想要的URL(以及其他一些條目,我通過快速if()聲明跳過)。如何在foreach循環中修改Perl數組中的元素?

foreach my $var(@input_1) { 
    #Skip anything that doesn't start with http: 
    if ((/^[#U]/) || !(/^h/)) { 
     next; 
    } 
    #Split the .csv into the relevant field: 
    my @fields = split /\s?\|\s?/, $_; 
    $var = uri_unescape($fields[0]); 
} 

我的分隔符是csv中的|。在當前的設置中,當我將$_更改爲$var時,它只返回空白行。當我在循環開始時刪除$var聲明並使用$_時,它將以正確的格式輸出URL。但在這種情況下,我怎樣才能將輸出分配給數組中的同一個元素?這是否需要第二個數組輸出值?

我對perl比較陌生,所以我確信有一些東西我失蹤了。我現在還不知道爲什麼在foreach聲明中刪除$var會中斷@fields行的解析,但刪除它並使用$_則不行。閱讀perlsyn文檔並沒有達到我想要的那麼多。任何幫助感謝!

+0

您並未將所有'$ _'都更改爲'$ var'。 'if'條件和'split'仍然使用'$ _'。 – shawnhcorey

回答

3

/^h/沒有綁定任何東西,所以匹配發生在$_。如果你想匹配$var,你必須將其綁定:

if ($var =~ /^[#U]/ || $var !~ /^h/) { 

使用||有兩場比賽很可能被合併成一個單一的正則表達式與替代:

next if $var =~ /^(?: [#U] | [^h] | $)/x; 

即該生產線具有從#,U開始,h以外的東西,或者是空的。

您可以通過使用push填充結果的新數組:

push @results, $var; 

還要注意的是,如果你的數據可以包含|引用或轉義(或換行符等),你應該使用Text::CSV代替split

+0

我會使用Text :: CSV,不管當前數據是否有'|'字符在裏面。 「簡單」格式(如CSV)中有足夠的邊緣案例,除了最微不足道的情況外,不會爲其編寫自己的解析器。 –

+0

謝謝。編輯if字段修復它。我甚至沒有想過要看看如果建設。我會研究Text :: CSV,聽起來像我會用很多東西。 –

相關問題