我正在尝试从我的输出中获取 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'};
}
最后我需要一个包含设备名称和 IP 地址的 csv 文件。
现在我只使用两种方法:
Name
和NetworkDeviceIPList
(只是为了清理我的输出信息)。不幸的是,在 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 数组。
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
并对返回的对象进行进一步的方法调用。 †
注意
一个对象是一个引用,通常是一个散列引用,并且 can 确实可以这样使用它。然而,那是不好的,它会带来麻烦,真的不应该这样做。
对对象内部的每一次探索都可能最终导致程序崩溃,而且根据该业务的性质,可能会以难以诊断(发现)的微妙方式崩溃。
请记住,关于类的重要一点是为其功能提供接口并保护内部结构免受任何义务;它封装了实现,因此原则上对用户是不可见的。内部可能会随时更改,恕不另行通知,而且可能会以微妙的方式更改。
一个人应该 always 找到为该类提供的方法并且只使用那些方法。
* CPAN 页面的细节似乎少得多
† 即使您要直接从
$networkdevices
检索值,它也是一个 hashref,因此需要首先取消引用,$networkdevices->{...}{...}
在第一级之后我们确实可以通过 syntax convenience . (但请不要对物体这样做。)