我有一個網址,例如「www.google.com/aabc/xyz」。我怎樣才能從這個主機名?我用這個代碼:如何從Perl中的URL獲取主機名?
my $referer = URI->new('www.google.com/aabc/xyz');
my $host = $referer->host; //compiler error
我在第二行發生錯誤。
我有一個網址,例如「www.google.com/aabc/xyz」。我怎樣才能從這個主機名?我用這個代碼:如何從Perl中的URL獲取主機名?
my $referer = URI->new('www.google.com/aabc/xyz');
my $host = $referer->host; //compiler error
我在第二行發生錯誤。
$ 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
你可以做得比上面簡單得多。
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
謝謝,它的工作 – user5251476
正則表達式將覆蓋很多情況,但也有模塊將覆蓋邊緣情況。這隻取決於你需要什麼。 – oalders
use URI;
use URI::Heuristic qw(uf_uristr);
my $referrer = URI->new(uf_uristr('www.google.com/aabc/xyz'));
print $referrer->host;
Perl不認識使用URI :: Heuristic qw(uf_uristr);命令//錯誤 – user5251476
如果你不告訴我錯誤是什麼,我不能幫你。 – oalders
500內部錯誤 「執行CGI時遇到意外錯誤 請與管理員聯繫狀態:500內部錯誤內容類型:text/html」這是錯誤。如果我刪除使用「URI :: Heuristic qw(uf_uristr);」我沒有得到錯誤,但「 - >主機」會給出錯誤。 – user5251476
的問題,因爲我的第一個答案,我已經刪除了顯著變化。足夠高的代表你可以看到它。
你必須在代碼中(最好是發佈完整的程序):
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";
}
現在你的程序不應該炸掉出於同樣的原因,你可以看看輸出發現字符串,你無法處理。
'^(https?:\/\ /)?(www。)?\ b' –
試試'some.awww.net' – Davislor
少代碼不是一種美德。你的編譯器不關心你使用多少個字節。 – Sobrique