所以我试图将所有编号的域放在哈希的元素上,这样做:
### 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
是所有编号的域名,所以任何想法如何?
答案 0 :(得分:0)
拿走目前的内容,然后使用正则表达式:
/\d+\.\d+/
如果匹配这个,那么它是一对数字,所以删除它。
通过这种方式,您可以将任何带有数字的单词保留在其中。
答案 1 :(得分:0)
你真的不需要将变量分成两部分,例如这个正则表达式将匹配您想要陷阱的情况:
/\d{1,3}\.\d{1,3}$/
- 如果字符串以两个由点
但我的意思是,如果您只需要将那些未编号的域分开,您只需检查域中的最后一个字符是否为字母,因为TLD不能包含数字,因此您可以执行类似的操作
/\w$/
- 如果返回true,则它不是编号域(假设您已剥离空格和新行)
但是我认为在正则表达式中更具体一点是更好的,这也更好地说明了你在脚本中寻找的逻辑,所以我会使用前一个正则表达式。
实际上你可以这样做:
if (my ($domain) = $name =~ /\.(\w+.\w+)$/)
{
#the domain is assigned to the variable $domain
} else {
#it is a number domain
}
答案 2 :(得分: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
,但会立即将$foo
重置为OTHER
,并递增$domain{OTHER}
。
我们需要您的初始数据样本,也许是打印输出的实际例程。