来自散列Perl的CSV文件

z9gpfhce  于 2023-04-09  发布在  Perl
关注(0)|答案(1)|浏览(132)

我试图从我的输出得到csv文件。

use Net::Cisco::ISE;
 use Data::Dumper;
 use Text::CSV;

 my $ise = Net::Cisco::ISE->new(hostname=>'hostname', username=>'user', password=>'user');  
 $ise->namespace3;
 $ise->namespace5;

 my $networkdevices = $ise->networkdevices;
 for my $name (keys %{$networkdevices})
    {
       print   Dumper $ise->networkdevices("id" => $networkdevices->{$name}->id);
    }

输出:

$VAR1 = bless( {
             'NetworkDeviceGroupList' => {
                                           'NetworkDeviceGroup' => [
                                                                   'Device Type#All Device Types',
                                                                   'IPSEC#Is IPSEC Device#No',
                                                                   'Location#All Locations'
                                                                 ]
                                         },
             'tacacsSettings' => {
                                   'previousSharedSecretExpiry' => '0',
                                   'connectModeOptions' => 'OFF',
                                   'sharedSecret' => '******'
                                 },
             'NetworkDeviceIPList' => {
                                        'NetworkDeviceIP' => {
                                                             'mask' => '24',
                                                             'ipaddress' => '10.66.0.0'
                                                           }
                                      },
             'name' => 'LAB-Distri',
             'coaPort' => '1700',
             'authenticationSettings' => {
                                           'radiusSharedSecret' => '******',
                                           'keyInputFormat' => 'ASCII',
                                           'enableKeyWrap' => 'false',
                                           'networkProtocol' => 'RADIUS'
                                         },
             'profileName' => 'Cisco',
             'id' => '3d21e200-a534-11e3-82cc-00505694f123'
           }, 'Net::Cisco::ISE::NetworkDevice' );

这个脚本应该给予我我选择的元素(ipaddress和名称)在控制台,但它不工作

foreach $name (keys %{$networkdevices}){
   print  
   my $ip = $networkdevices{$name}{'ipaddress'};
   my $name = $networkdevices{$name}{'name'};
   }

在结束时,我需要一个csv文件的名称和IP地址从设备。
现在我只使用两种方法:NameNetworkDeviceIPList(只是为了清理我的输出信息)。不幸的是,在Net::Cisco::ISE中没有方法只让IPs获得ips。我可以调用NetworkDeviceIPList并获得:

for my $name (keys %{$networkdevices}){
 my $device = $ise->networkdevices("id" => $networkdevices->{$name}->id);
 print Dumper $device->name;
 print Dumper $device->NetworkDeviceIPList;
 }

我有这样的输出:

$VAR1 = 'LAB-W';
 $VAR1 = {
    'NetworkDeviceIP' => {
    'mask' => '32',
    'ipaddress' => '10.66.1.12'
  }
  };

但我不知道现在如何从这个输出csv数据与数组的名称和ips。

mrzz3bfm

mrzz3bfm1#

Dumper输出以“bless”开头,因此您手头上有对象,因此需要找到查询它们的方法,而不是直接插入它们的hashref。
来自Net::Cisco::ISE文档 *

网络设备

返回的哈希包含Net::Cisco::ISE::NetworkDevice的示例...
...
当您知道主机名或ID时,使用devices调用,参数如下所示。
它标识了返回的对象属于哪个类,并给予了一个例子

my $device = $ise->networkdevices("id","123");

然后通过Net::Cisco::ISE::NetworkDevice查找在$device上使用的方法。
所以你不用

my $ip = $networkdevices{$name}{'ipaddress'}; # etc

如上所述使用$ise->networkdevices,并对返回的对象进行进一步的 * 方法调用 *。†

备注

一个对象是一个引用,通常是一个散列引用,人们确实可以这样使用它。然而,这是不好的,它会带来麻烦,而且真的不应该这样做。
对对象内部结构的每一次深入都可能最终导致程序崩溃,而且根据业务的性质,可能会以难以诊断(发现)的微妙方式。
请记住,类的一个重要方面是为它的功能提供一个接口,并保护内部不受任何约束;它封装了实现,因此原则上对用户是不可见的。2内部可能在任何时候改变,没有任何通知,也许是以微妙的方式。
我们应该 * 总是 * 找到为该类提供的方法,并且只使用这些方法。

  • CPAN页面对此的详细信息似乎少得多

†即使你直接从$networkdevices中获取值,它也是一个hashref,所以需要首先解引用$networkdevices->{...}{...},在第一层之后,我们可以通过语法方便地删除箭头(但请不要对对象这样做)。

相关问题