首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl以获取唯一和排序元素上的计数器。

Perl以获取唯一和排序元素上的计数器。
EN

Stack Overflow用户
提问于 2013-11-22 22:31:08
回答 1查看 101关注 0票数 0

我有一个perl脚本,它运行在cisco交换机上,并执行'show mac-address table dynamic‘命令。它将数据存储在@ver中。然后,我使用正则表达式只从@ver获取mac地址,然后根据所需的初始八位地址来区分mac地址。现在,我希望排序以及唯一的mac地址,以及计数器的唯一地址被重复了多少次。我使用的是linux命令‘排序\ uniq -d -c’。简单地说,脚本如下:

代码语言:javascript
复制
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。请告诉我哪里出了问题。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-22 23:00:04

如果您有一个list @list,并且您想要从中获得唯一的元素,那么您必须使用一个散列:

代码语言:javascript
复制
my @list = ('c', 'c', 'a', 'a', '1', '1') ;
my %unic ;
for my $it (@list) {
$unic{$it}++
}

for my $k (sort keys %unic) {
    print $k, " "
}

在您的代码中,我看到了许多不同的问题,但是如果没有解析的源文件,很难提出解决方案。

代码语言:javascript
复制
 @final_macaddr = qx (@sonic_macaddr | sort | uniq -d -c);

perl成语qx (“引号执行”)将执行分叉到操作系统,操作系统不知道@sonic_macaddr是什么,因为它是一个Perl变量!在Perl脚本中使用散列来“排序unic”。

代码语言:javascript
复制
push (@sonic_macaddr, $mac_addr."\n");

我不会将"\n“推到列表中:打印时添加它要好得多,例如:

代码语言:javascript
复制
for my $it (@sonic_macaddr) {
    print $it, "\n" ; 
}

甚至:

代码语言:javascript
复制
print join "\n", @sonic_macaddr ; 

你永远不知道什么时候你需要一张清晰的mac地址列表;)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20155724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档