当前位置:编程学习 > 网站相关 >>

Perl解析www[1-3,5][2-6].ph4nt0m.org形式机器名

Submitted by 云舒
这几天在作服务器检查时,碰到一些畸形的机器名要解析,类似这样的:
代码:

www[1-4].ph4nt0m.org
www[01-14].ph4nt0m.org
www[1-5][1,2][3-5].ph4nt0m.org

我原来那个执行ssh命令的程序使用C作的,但是现在需要解析这样的机器名,还用C作的话太吃亏了。因为C不擅长处理字符串,我未必能够做得出来。干脆再写一个perl程序,来配合原来的那个程序执行。先解析机器名,然后再跑ssh程序登陆执行检查。于是就有了下面这个程序,主要是使用了堆栈的方法来递归的。先从数组中拿出一个元素解析一个中括号,如果还有中括号,将解析了之后的元素再压入数组,直到所有的中括号都展开了结束。

代码:

#!/usr/bin/perl

use strict;
use warnings;

open( RH, "<ServerList.txt" ) || die "Open server list error. ";

my @hosts = <RH>;
chomp( @hosts );

my @hostlist;
while (@hosts)
{
my $host = shift(@hosts);
# 没有中括号需要展开的,直接push到机器名列表中
if( index( $host, "[" ) == -1 )
{
push( @hostlist, $host );
next;
}

#www[1-5].ph4nt0m.org
#www[1-5][2-6].ph4nt0m.org
#www[1-5,7,9].ph4nt0m.org
# 展开一个[ ]
elsif( $host =~ /^(.*?)[(.*?)](.*)/ )
{
my $pre = ;
my $ext = ;
my $post = ;

# 按逗号分割
my @feilds = split( /,/, $ext );
my $tmp_host;
foreach my $feild( @feilds )
{
# 如果没有 - 符号则直接保存结果
if( index( $feild, "-" ) == -1 )
{
$tmp_host = $pre.$feild.$post;

# 展开[ ]之后是否还存在[ ],存在则压入数组继续展开,否则压入结果数组
if( index( $tmp_host, "[" ) != -1 )
{
push( @hosts, $tmp_host );
}
else
{
push( @hostlist, $tmp_host );
}

next;
}

# 如果有-再按-分割一次
else
{
my @nums = split( /-/, $feild );
my $len = length( $nums[0] );
$nums[0] =~ s/^0+//;
$nums[1] =~ s/^0+//;

my $fmt = "%0" .$len. "d";
for( my $flag = $nums[0]; $flag <= $nums[1]; $flag++ )
{
$tmp_host = $pre. sprintf( $fmt, $flag ). $post;

# 展开[ ]之后是否还存在[ ],存在则压入数组继续展开,否则压入结果数组
if( index( $tmp_host, "[" ) != -1 )
{
push( @hosts, $tmp_host );
}
else
{
push( @hostlist, $tmp_host );
}
}
}
}
}
}

foreach my $host( @hostlist )
{
print "$host ";
}

补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,