簡體   English   中英

我應該如何使用Perl URI類?

[英]How should I use Perl URI class?

我需要在Perl程序中處理一些HTTP URL,但我懷疑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類,並使用正則表達式解析URL
    • 我仍然寧願使用庫解決方案而不是自己調試
  • try { ... } catch { ... }包裝URI操作
    • 看到第一點

使用URI類是否有一種理智,簡單的方法? 我沒有想到的簡單(在上面的列表中)?

我認為你的問題可以概括為:參數驗證很繁瑣,我該怎么辦呢?

  1. 我也不喜歡它。 這是開發商之間不同意見的問題,其他人說強制比切片面包更好,特別是當由Moose自動完成時。 我認為只允許一種類型的程序簡化了程序。 此外,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. 是的,是的。

暫無
暫無

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

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