2012-03-12 18 views
0

私は、次のスニペットコードがあります。Perlのホスト名の正規表現

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

このようなものが得られますここから

blahblah.test1234.mydomain.com has address 12.345.67.8910(私はダミーの値と実際の値を置き換え)

を、I $hostnameには「blahblah.test1234.mydomain.com」しかなく、残りは忘れてしまいます。

このようなcの部分odeは異なるサーバーで実行されるため、このサイズはさまざまです。私は基本的に*.mydomain.com

+0

をインデントしてくださいもらえますか?バックティックは絶対的な騒乱を引き起こしている。 – MattLBeck

答えて

3

あなたはおそらくに砲撃するのではなく、Perlの自身のgethostbynameNet::DNS::Resolverを使用したほうが良いと思いアップmydomain.comに行の先頭からカットされる正規表現を使用して考えていた

コマンドラインプログラム。あなたが最初の空白の前に何でも保存しておきたいことを保証することができる場合

+0

私はNet :: Domain qw(hostname hostfqdn hostdomain)を使用して終了しました。と私の$ホスト名= hostfqdn(); –

+0

'gethostbyname'は古いIPv4特有の廃止予定リゾルバです。 最新のものでは、 'Socket :: getaddrinfo()'を使いたいと思っています。 – LeoNerd

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); 
2

単にコアモジュールSys::Hostname使用:関連QUを答えるために

perl -MSys::Hostname -le 'print hostname' 
1

をあなたのコードのestion(すなわち、 「どのように私は与えられたDNSクエリ名の正規名を決定します」Socket::getaddrinfo()AI_CANONNAMEフラグを参照してください):あなたは4つのスペースであなたのコードを

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";