Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5352003
  • 博文数量: 1144
  • 博客积分: 11974
  • 博客等级: 上将
  • 技术积分: 12312
  • 用 户 组: 普通用户
  • 注册时间: 2005-04-13 20:06
文章存档

2017年(2)

2016年(14)

2015年(10)

2014年(28)

2013年(23)

2012年(29)

2011年(53)

2010年(86)

2009年(83)

2008年(43)

2007年(153)

2006年(575)

2005年(45)

分类: LINUX

2008-11-16 08:18:58

Perl解析www[1-3,5][2-6].ph4nt0m.org形式机器名
Submitted by on 2007, November 22, 2:09 PM.
这几天在作服务器检查时,碰到一些畸形的机器名要解析,类似这样的:
代码:

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


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

代码:

#!/usr/bin/perl

use strict;
use warnings;

open( RH, "
my @hosts = ;
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 = $1;
        my $ext = $2;
        my $post = $3;
        
        # 按逗号分割
        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\n";
}
阅读(1527) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~