使字符串的字符最多到第一个“。”。

时间:2018-08-14 17:08:37

标签: string perl split

我正在尝试使用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网站,返回值不是字符串,而是标量值,因此我尝试拆分它的方法无效。

在拆分或解析主机名之前,我不知道如何将其转换为字符串。

3 个答案:

答案 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'