正则获取"*...*"之间的内容,求补集.请教您

正则获取"*...*"之间的内容,求补集.请教您

文本中有很多IP地址,我用类似方式表示:
姓名A      *192.168.1.1*    MAC地址A
姓名B      *192.168.1.2*    MAC地址B
.........
1.如何用正则获取该IP地址(/^*$/,然后取$&的值,但似乎不行啊,我又尝试用()标识匹配内容,然后取$1依然不行)
2.为方便日后分配IP,我想求现已分配IP的数组@ip的补集,这个补集该如何写呢?
谢谢指教!
/\s+\*(.*)\*\s+/  ### $1 is what you need


For the complementary set, do you mean that just exclude the allocated IPs from 1-254?
楼上的老大,谢谢
是1-254,如何打印出没有分配的IP呢?即如何求这个补集.请指教
#!/usr/bin/perl -w
use strict;
my %total=map {$_,1} (1..254);
open(DATA,"file") || die("open file err");
while(my $line=<DATA>){
        my ($ip)=$line=~/\s+\*(.+)\*/;
        delete $total{substr($ip,rindex('.',$ip))};
        print "yes:\t$ip\n";
}
foreach(sort {$a<=>$b} keys %total){
        print "no:\t192.168.1.$_\n";
}
谢谢楼上的兄弟,如何能给点注释就最好了,呵呵!
perl中有没有什么函数可以求一个数组的补集的啊?
比如:
@a=qw/1 2 3 5/;
@all=/1 2 3 4 5/;
如何求@a的补集啊?


QUOTE:
原帖由 windows.li 于 2007-9-24 23:38 发表
谢谢楼上的兄弟,如何能给点注释就最好了,呵呵!
perl中有没有什么函数可以求一个数组的补集的啊?
比如:
@a=qw/1 2 3 5/;
@all=/1 2 3 4 5/;
如何求@a的补集啊?

现成的是没有的, 不过, there is more than one way to do it.

比如楼上的hash.

或者: 把@a和@all放在一起sort, 去掉重复项.

或者: 如果全集是连续自然数, 可以对@a排序后, 判断相邻元素的差值.
vincentn 回复的代码有点小问题:修正如下:
#!/usr/bin/perl -w
use strict;
my %total=map {$_,1} (1..254);
open(DATA,"< ip.txt") || die("open file err");
while(my $line=<DATA>){
        my ($ip)=$line=~/\s+\*(.+)\*/;
        delete $total{substr($ip,rindex($ip,'.')+1)};//rindex方法有点问题,
        print "yes:\t$ip\n";
}
foreach(sort {$a<=>$b} keys %total){
        print "no:\t192.168.1.$_\n";
}
利用相邻差值来生成补集

my @all = (0..10);
my @part = qw/0 5 7 9/;

my @part_tmp = (@part, $all[-1]);
my @cmpl = ($all[0] - 1);
map { push(@cmpl, pop(@cmpl) + 1 .. $_) } @part_tmp;
print join(" ", @cmpl);
呵呵,谢谢大家!
前段时间去当当网看<perl语言编程第3版>,因为自己有电子版,犹豫之下没有下定单,现在居然断货了~~又去China-Pub上看了看,到货了,58元一本,好便宜啊,都怕印刷有问题,呵呵(传统思想)!昨天早上下了定单,配货居然配了一天,到现在还没发货,晕死~本来打算本周5收货带回家10.1好好看看的,9成没戏了!
看看自己都发100多帖了,还有很多基本问题没有搞清楚,汗啊!哈哈......再不敢发帖子了,霍霍!