2012-03-12 2 views
0

У меня есть следующий фрагмент кода:Perl имя хоста регулярное выражение

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

который это дает что-то вроде:

blahblah.test1234.mydomain.com has address 12.345.67.8910 (я заменил реальные значения с фиктивными значениями)

отсюда, я хочу извлечь это так, чтобы $hostname только «blahblah.test1234.mydomain.com» и забыл остальное

Такая часть c ode будет запускаться на разных серверах, поэтому размер этого может отличаться.

Я думал, используя регулярное выражение, которое будет вырезано от начала линии до mydomain.com поэтому в основном *.mydomain.com

+0

Не могли бы вы отступы ваш код 4 пробелов? Обратные образы вызывают абсолютный хаос. – MattLBeck

ответ

3

Вы, вероятно, будет лучше использовать Perl собственного gethostbyname или Net::DNS::Resolver вместо выкладывая к командной строки.

+0

спасибо, что я закончил использование Net :: Domain qw (hostname hostfqdn hostdomain); и my $ hostname = 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); 
1

Чтобы ответить на соответствующий Qu в вашем коде (а именно; «Как определить каноническое имя заданного 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"; 
Смежные вопросы