2015-09-09 35 views
0

我有一個網址,例如「www.google.com/aabc/xyz」。我怎樣才能從這個主機名?我用這個代碼:如何從Perl中的URL獲取主機名?

my $referer = URI->new('www.google.com/aabc/xyz'); 
my $host = $referer->host; //compiler error 

我在第二行發生錯誤。

+0

'^(https?:\/\ /)?(www。)?\ b' –

+1

試試'some.awww.net' – Davislor

+1

少代碼不是一種美德。你的編譯器不關心你使用多少個字節。 – Sobrique

回答

0
$ echo -e "http://www.google.www.com/abc/xyz\nhttps://google.com\nwww.google.www.com" 
http://www.google.www.com/abc/xyz 
https://google.com 
www.google.www.com 

$ echo -e "http://www.google.www.com/abc/xyz\nhttps://google.com\nwww.google.www.com" | perl -pe "s/^(http(s)?:\/\/)?(www\.)?//" 
google.www.com/abc/xyz 
google.com 
google.www.com 
0

你可以做得比上面簡單得多。

CODE

use strict; 
use warnings; 

while (<DATA>) { 
    $_ =~ s/^(https?:\/\/)?(www.)?\b//; 
    print $_ ; 
} 

__DATA__ 
http://www.google.com/abc/xyz 
https://google.com 
www.google.com 

結果

google.com/abc/xyz 

google.com 

google.com 
+0

謝謝,它的工作 – user5251476

+0

正則表達式將覆蓋很多情況,但也有模塊將覆蓋邊緣情況。這隻取決於你需要什麼。 – oalders

1
use URI; 
use URI::Heuristic qw(uf_uristr); 

my $referrer = URI->new(uf_uristr('www.google.com/aabc/xyz')); 
print $referrer->host; 
+0

Perl不認識使用URI :: Heuristic qw(uf_uristr);命令//錯誤 – user5251476

+0

如果你不告訴我錯誤是什麼,我不能幫你。 – oalders

+0

500內部錯誤 「執行CGI時遇到意外錯誤 請與管理員聯繫狀態:500內部錯誤內容類型:text/html」這是錯誤。如果我刪除使用「URI :: Heuristic qw(uf_uristr);」我沒有得到錯誤,但「 - >主機」會給出錯誤。 – user5251476

0

的問題,因爲我的第一個答案,我已經刪除了顯著變化。足夠高的代表你可以看到它。

你必須在代碼中(最好是發佈完整的程序):

my $referer = URI->new('www.google.com/aabc/xyz'); 
my $host = $referer->host; //compiler error 

你說,你得到一個編譯器錯誤,但它的確是一個運行時錯誤:

Can't locate object method "host" via package "URI::_generic" 

當您創建新對象時,您給了URI一個字符串。從那以後,它會猜測它是什麼樣的URI。由於在它之前沒有方案,例如http://,所以它不會猜測它是那種類型的URI。相反,它回落到「通用」類URI::_generic。在它的名字下面加上下劃線,而且沒有任何文件,你可以推測它不適合你瞭解。

但是,這裏是抱怨。它認爲URI是一條路徑(以及其他一些東西)。你認識到作爲主機的部分它解析爲一個路徑:

use v5.10; 

use URI; 

my $referer = URI->new('www.google.com/aabc/xyz'); 
my $path = $referer->path; 

say "path is $path"; 

現在你看到它的所作所爲:

path is www.google.com/aabc/xyz 

通用URI不知道主機東西,所以當你打電話它的對象host,它炸燬了。也許它會更好地返回undef,但這不是它所做的。

oanders已經有一個interesting answer that guesses for you填寫計劃,當它認爲他們可能會失蹤,但還有一件事你可以做。在打電話之前,主機,檢查對象可以對此作出迴應:

use v5.10; 

use URI; 

my $url = 'www.google.com/aabc/xyz'; 
my $referer = URI->new($url); 

if($referer->can('host')) { 
    say "Host is " . $referer->host; 
    } 
else { 
    say "Weird hostless URL: $referer"; 
    } 

現在你的程序不應該炸掉出於同樣的原因,你可以看看輸出發現字符串,你無法處理。