2012-03-12 55 views
0

我有以下的代碼片段:Perl的主機名正則表達式

my $hostname = `host \`hostname\``; 

此產生類似:

blahblah.test1234.mydomain.com has address 12.345.67.8910(我取代虛擬值實際值)

從這裏

,我想提取這個,所以$hostname只有「blahblah.test1234.mydomain.com」而忘記其餘的

這樣一塊c頌歌將運行在不同的服務器上,因此其大小可能會有所不同。

我用正則表達式將從行的開頭被切割到mydomain.com所以基本上*.mydomain.com

+0

可否請你用4個空格縮進代碼?反引起了絕對的混亂。 – MattLBeck 2012-03-12 21:01:11

回答

3

你可能會更好用perl自己gethostbynameNet::DNS::Resolver代替炮擊了一個思維命令行程序。

+0

謝謝我結束了使用Net :: Domain qw(hostname hostfqdn hostdomain);和我的$ hostname = hostfqdn(); – 2012-03-12 21:18:48

+0

'gethostbyname'是舊的IPv4特定傳統棄用解析器。 對於現代的東西,你想要使用'Socket :: getaddrinfo()'。 – LeoNerd 2012-03-13 10:53:22

0

如果你能保證你只需要保持第一空格前是什麼,試試這個:

$hostname =~ s/(.*?)\s+.*/\1/; 

它會產生「blahblah.test1234.mydomain.com」爲以下幾點:

$hostname = "blahblah.test1234.mydomain.com has address 12.345.67.8910"; 
$hostname =~ s/(.*?)\s+.*/\1/; 
print($hostname); 
1

要回答相關曲在你的代碼中(即; 「如何確定一個給定的DNS查詢名的規範名稱」),看到AI_CANONNAME標誌Socket::getaddrinfo()

use strict; 
use warnings; 
use Socket qw(getaddrinfo AI_CANONNAME); 

my ($err, @res) = getaddrinfo($ARGV[0], "", { flags => AI_CANONNAME }); 
die "$err\n" if $err; 

print "$res[0]->{canonname}\n";