2012-02-11 45 views
5

我需要在Perl程序中處理一些HTTP URL,但我懷疑URI類應該如何幫助我。我應該如何使用Perl URI類?

特別是,我想使用URI類來解析相對URL並獲取它們的組件。然而,問題是:

  1. 我需要一個函數來既URI對象和URI字符串作爲參數的工作(或確保只有一個被傳遞)

    sub foo_string_or_url { 
        my $uri = URI->new(shift); 
    

    是正確的做法?我不太喜歡它,因爲它將URI串聯起來,並不必要地創建新的對象。

  2. 提取物成分

    my $host = $uri->host; 
    

    這也是有問題的,因爲不是所有的URI■找主持人,特別是,如果有人通過垃圾的功能,這將die()

  3. 解析相對URL

    my $new_url = URI::URL->new($uri, $base)->abs; 
    

    IIUC,沒有->abs,結果仍將字符串化的相對URL(而不會爲HTTP::Request的工作),對嗎?此外,這是保證返回URI

我應該如何處理這些問題?這種可能性是

  • 使用->isa('URI')->can("host")
    • 似乎容易出錯,醜對我所有的時間
  • 不要使用URI類在所有使用正則表達式
    • 解析網址我寧願使用一個庫解決方案,而不是調試我自己的
  • try { ... } catch { ... }
    • URI操作見第一點

是否有使用URI類的理智,很簡單的方法?我沒有想過的簡單東西(在上面的列表中)?

回答

7

我認爲你的問題可以總結:參數驗證是乏味的,我該怎麼辦呢?

  1. 我也不喜歡它。這是開發商之間不同意見的問題,其他人認爲強制比切片面包更好,尤其是當由穆斯自動完成時。我認爲只允許一種簡化程序。此外,YAGNI適用於絕大多數情況。如果拒絕錯誤類型,請使用幫助器模塊,例如Params::Validate/MooseX::Method::Signatures/MooseX::Declare以避免您的代碼示例中顯示的手動檢查。

  2. 這是所需的行爲。異常處理機制讓你可以編寫適合每種情況的自定義代碼。如果您認爲它不美觀,請將其刪除,並介意讓異常不受限制的後果。

    use Try::Tiny; 
    my $host; 
    try { 
        $host = $uri->host; 
    } catch { 
        warn "Could not determine host for $uri. Message was: $_. Retry/abort/ignore?\n"; 
        … 
    }; 
    
  3. 是的,是的。

+3

唯一沒有回答的問題是「我應該如何處理這些問題?」,答案是「總是調用abs」。如果您已經擁有絕對URI,它將不會執行任何操作。 – ikegami 2012-02-11 21:02:10

相關問題