我有一个perl脚本,它运行在cisco交换机上,并执行'show mac-address table dynamic‘命令。它将数据存储在@ver中。然后,我使用正则表达式只从@ver获取mac地址,然后根据所需的初始八位地址来区分mac地址。现在,我希望排序以及唯一的mac地址,以及计数器的唯一地址被重复了多少次。我使用的是linux命令‘排序\ uniq -d -c’。简单地说,脚本如下:
my @ver = $session->cmd('show mac-address-table dynamic');
my $mac_addr;
my @sonic_macaddr;
my @final_macaddr;
for my $line (@ver) {
if (my ($mac_addr) = $line =~ /((?:[0-9a-f]{4}\.){2}[0-9a-f]{4})/) {
$mac_addr = $1;
if ($mac_addr =~ m/^(0018)[.]/ or $mac_addr =~ m/^(a0ce)[.]/ or $mac_addr =~ m/^(0009)[.]/){
push (@sonic_macaddr, $mac_addr."\n");
@final_macaddr = qx (@sonic_macaddr | sort | uniq -d -c);
print @final_macaddr;
}
}
}
$session->close()如果我使用qx在脚本本身中执行它,则不会获得所需的输出,否则它在命令行上工作良好。例如,perl.pl @ sort \ uniq -d -c。请告诉我哪里出了问题。谢谢。
发布于 2013-11-22 23:00:04
如果您有一个list @list,并且您想要从中获得唯一的元素,那么您必须使用一个散列:
my @list = ('c', 'c', 'a', 'a', '1', '1') ;
my %unic ;
for my $it (@list) {
$unic{$it}++
}
for my $k (sort keys %unic) {
print $k, " "
}在您的代码中,我看到了许多不同的问题,但是如果没有解析的源文件,很难提出解决方案。
@final_macaddr = qx (@sonic_macaddr | sort | uniq -d -c);perl成语qx (“引号执行”)将执行分叉到操作系统,操作系统不知道@sonic_macaddr是什么,因为它是一个Perl变量!在Perl脚本中使用散列来“排序unic”。
push (@sonic_macaddr, $mac_addr."\n");我不会将"\n“推到列表中:打印时添加它要好得多,例如:
for my $it (@sonic_macaddr) {
print $it, "\n" ;
}甚至:
print join "\n", @sonic_macaddr ; 你永远不知道什么时候你需要一张清晰的mac地址列表;)
https://stackoverflow.com/questions/20155724
复制相似问题