0

因此,我试图将所有编号的域放入哈希的元素中:

### Domanis ###
my $dom = $name;
$dom =~ /(\w+\.\w+)$/; #this regex get the domain names only
my $temp = $1;

if ($temp =~ /(^d+\.\d+)/) { # this regex will take out the domains with number 
    my $foo = $1;
    $foo = "OTHER";
    $domain{$foo}++;
}
else {
    $domain{$temp}++;
}

哪里$name会是这样的:

something.something.72.154
something.something.72.155
something.something.72.173
something.something.72.175
something.something.73.194
something.something.73.205
something.something.73.214
something.something.abbnebraska.com
something.something.cableone.net
something.something.com.br
something.something.cox.net
something.something.googlebot.com

我的代码目前打印这个:

72.175
73.194
73.205
73.214
abbnebraska.com
cableone.net
com.br
cox.net
googlebot.com
lstn.net

但我希望它像这样打印:

abbnebraska.com
cableone.net
com.br
cox.net
googlebot.com
OTHER
lstn.net

所有编号的域在哪里OTHER,所以有什么想法吗?

4

3 回答 3

0

采用它当前放置的内容,并使用正则表达式:

/\d+\.\d+/

如果它匹配这个,那么它是一对数字,所以删除它。

这样,您就可以保留任何带有数字的单词。

于 2013-11-12T22:43:33.417 回答
0

您真的不需要将变量分成两部分,例如,此正则表达式将匹配您要捕获的情况: /\d{1,3}\.\d{1,3}$/-- 如果字符串以两个 1-3 长的数字结尾,由点分隔,则返回 true

但我的意思是,如果你只需要分隔那些没有编号的域,你可以检查域中的最后一个字符是否是字母,因为 TLD 不能包含数字,所以你会做类似的事情 /\w$/——如果返回 true,它不是编号域(前提是您已去除空格和换行符)

但我认为最好在正则表达式中更具体,这也更好地说明了您在脚本中寻找的逻辑,所以我会使用前一个正则表达式。

实际上你可以做这样的事情:

if (my ($domain) = $name =~ /\.(\w+.\w+)$/)
{
#the domain is assigned to the variable $domain
} else {
#it is a number domain
}
于 2013-11-12T23:03:03.873 回答
0

请正确缩进您的代码,并使用空格分隔各个部分。它会让你的代码更容易阅读。

有趣的是,您提到您得到了错误的输出,但是您发布的代码部分没有print, printf, 或say语句。看起来您正在尝试计算各种域名。

如果这些是 的值$name,那么这里有几个问题:

if ($temp =~ /(^d+\.\d+)/) {

什么都不匹配。这就是说您的字符串以一个或多个字母开头d,后跟一个句点,后跟一个或多个数字。将^您的正则表达式锚定到字符串的开头。

我认为,但不是 100% 肯定,你想要这个:

if ( $temp =~ /\d\.\d/ ) {

这将找到所有两个数字之间有句点的情况。这是 的子模式/\d+\.\d+/,因此两个正则表达式将匹配相同的内容。

$dom =~ /(\w+\.\w+)$/;

匹配整个字符串$dom中存在两个字母、数字的任何位置。或下划线之间有小数。那是你要的吗?

我也相信这可能表明某种错误:

my $foo = $1;
$foo = "OTHER";
$domain{$foo} ++;

这是设置为匹配$foo的任何内容,但随后立即重置为,并递增。$dom$fooOTHER$domain{OTHER}

我们需要您的初始数据样本,也许还需要打印您的输出的实际例程。

于 2013-11-12T23:25:19.280 回答