我有以下 Perl 代码:
my $wantedips;
# loop through the interfaces
foreach (@$interfaces) {
# local variable called $vlan
my $vlan = $_->{vlan};
# local variable called $cidr
my $cidr = $_->{ip} ."/".$nnm->bits();
# I dont understand this next bit.
# As a rubyist, it looks like a method called $cidr is being called on $wantedips
# But $cidr is already defined as a local variable.
# Why the spooky syntax? Why is $cidr passed as a method to $wantedips?
# what does ->{} do in PERL? Is it some kind of hash syntax?
$wantedips->{$cidr} = $vlan;
# break if condition true
next if ($ips->{$cidr} == $vlan);
# etc
}
我没有得到的部分在我的评论中。为什么$ cidr传递给$ wantips,两者都明确定义为局部变量?我是一个rubyist,这真的很令人困惑。我只能猜测$xyz->{$abc}="hello"
会创建某种类似的哈希:
$xyz => {
$abc => "hello"
}
我可能会告诉您 Perl 的新手。
答案 0 :(得分:2)
我不明白你为何习惯
my $vlan = $_->{vlan}
但是
$wantedips->{$cidr} = $vlan
给你带来麻烦?两者都使用相同的语法来使用哈希引用来访问哈希元素。
间接运算符 ->
用于将键,索引或参数应用于引用值,因此您可以通过其引用访问哈希的元素与
$href->{vlan}
数组的元素,用
引用$aref->[42]
并使用
调用代码引用$cref->(1, 2, 3)
为方便起见,为了使代码更清晰,您可以从序列]->[
和}->{
(以及括号和大括号的任意混合)中删除间接运算符。因此,如果您有嵌套数据结构,则可以编写
my $name = $system->{$ip_address}{name}[2]
而不是
my $name = $system->{$ip_address}->{name}->[2]
答案 1 :(得分:1)
#I dont understand this next bit. $wantedips->{$cidr} = $vlan;
$wantedips
是一个标量,特别是它是一个hashref(对哈希的引用)。
箭头从参考文献中获取内容。
{"keyname"}
是如何访问哈希中的特定键。
->{"keyname"}
是您如何访问哈希引用中的特定键
$cidr
也是一个标量,在这种情况下它是一个字符串。
->{$cidr}
从散列引用中访问密钥。
所以要把它们放在一起:
$wantedips->{$cidr} = $vlan;
表示“将$vlan
的值分配给存储在$cidr
中的字符串所描述的密钥,该密钥由$wantedips
引用。
我只能猜测$ xyz-> {$ abc} =“hello”会创建某种哈希值 等。
让我们将其分解为一步一步的例子,该例子剥离出与所讨论的代码没有直接关联的循环和其他位。
# Create a hash
my %hash;
# Make it a hashref
my $xyz = \%hash;
# (Those two steps could be done as: my $xyz = {})
# Create a string
my $abc = "Hello";
# Use them together
$xyz->{$abc} = "world";
# Look at the result:
use Data::Dump;
Data::Dump::ddx($xyz);
# Result: { Hello => "world" }