我正在尝试使用Perl的queueMonitor
函数。令人讨厌的是,它以标量格式返回整个域名。我只想解析主机名,然后丢弃其余的主机名。
我正在使用gethostnamebyaddr
将域名划分为一个数组,然后仅采用第一个值,但这似乎不起作用。
split
执行上述代码后,我得到以下信息:
#!/usr/bin/perl
use Socket;
my $name;
my $hostname;
my @tmpStr;
$name = gethostbyaddr(inet_aton("192.168.2.3"), AF_INET);
print "$name\n";
@tmpStr = split ".", $name;
$hostname = $tmpStr[0];
print "Host name is $hostname\n";
根据this网站,返回值不是字符串,而是标量值,因此我尝试拆分它的方法无效。
在拆分或解析主机名之前,我不知道如何将其转换为字符串。
答案 0 :(得分:7)
点字符对于Perl中的正则表达式具有特殊含义,split的第一个参数是正则表达式。您需要转义点:
use warnings;
use strict;
my $name = 'dc1-ent.ent.ped.local';
print "$name\n";
my @tmpStr = split /\./, $name;
my $hostname = $tmpStr[0];
print "Host name is $hostname\n";
这将输出:
dc1-ent.ent.ped.local
Host name is dc1-ent
答案 1 :(得分:2)
我会这样写
my $name = gethostbyaddr(inet_aton('192.168.2.3'), AF_INET);
my ($host) = $name =~ /([^.]+)/;
say $host;
答案 2 :(得分:1)
您的问题与gethostbyaddr()
无关,而是随后的问题。
证明:
DB<1> $name = 'dc1-ent.ent.ped.local';
DB<2> @tmpStr = split ".", $name;
DB<3> print @tmpStr;
(未打印任何内容)
尝试以这种方式使用split
:
DB<8> $name = 'dc1-ent.ent.ped.local';
DB<9> @tmpStr = split(/\./, $name);
DB<10> print @tmpStr;
dc1-ententpedlocal
DB<11> print join(' ', @tmpStr);
dc1-ent ent ped local
DB<12> x @tmpStr;
0 'dc1-ent'
1 'ent'
2 'ped'
3 'local'
或者,如果您绝对想要一个字符串而不是一个正则表达式,请同时保护该点,因为您的字符串仍被解析为正则表达式(这就是为什么用/ /
进行显式表示有其优点,这迫使您记住某些字符在其中具有特殊含义,例如点):
DB<1> $name = 'dc1-ent.ent.ped.local';
DB<2> @tmpStr = split('.', $name);
DB<3> print @tmpStr;
DB<4> @tmpStr = split('\.', $name);
DB<5> x @tmpStr
0 'dc1-ent'
1 'ent'
2 'ped'
3 'local'