被Perl中的局部变量和方法弄糊涂了
我得到了以下Perl代码:被Perl中的局部变量和方法弄糊涂了,perl,Perl,我得到了以下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 t
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被传递给$WANTEDIP,而两者都被明确定义为局部变量?我是个红宝石爱好者,这真让人困惑。我只能猜测$xyz->{$abc}=“hello”
会创建一个类似如下的散列:
$xyz => {
$abc => "hello"
}
正如您可能知道的那样,我不熟悉Perl
$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" }
$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" }
$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" }
$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" }
我不明白你为什么对我感到舒服
my $vlan = $_->{vlan}
但是
$wantedips->{$cidr} = $vlan
给你带来麻烦?两者都使用相同的语法来使用哈希引用访问哈希元素
间接运算符->
用于将键、索引或参数应用于引用值,因此您可以使用
$href->{vlan}
$aref->[42]
$cref->(1, 2, 3)
数组的元素,通过其引用
$href->{vlan}
$aref->[42]
$cref->(1, 2, 3)
并使用调用代码引用
$href->{vlan}
$aref->[42]
$cref->(1, 2, 3)
为了方便起见,为了使代码更干净,您可以从序列]->[
和}->{
(以及括号和大括号的任意组合)中删除间接运算符。因此,如果您有嵌套的数据结构,您可以编写
my $name = $system->{$ip_address}{name}[2]
而不是
my $name = $system->{$ip_address}->{name}->[2]
我不明白你为什么对我感到舒服
my $vlan = $_->{vlan}
但是
$wantedips->{$cidr} = $vlan
给您带来麻烦?两者都使用相同的语法来使用哈希引用访问哈希元素
间接运算符->
用于将键、索引或参数应用于引用值,因此您可以使用
$href->{vlan}
$aref->[42]
$cref->(1, 2, 3)
数组的元素,通过其引用
$href->{vlan}
$aref->[42]
$cref->(1, 2, 3)
并使用调用代码引用
$href->{vlan}
$aref->[42]
$cref->(1, 2, 3)
为了方便起见,为了使代码更干净,您可以从序列]->[
和}->{
(以及括号和大括号的任意组合)中删除间接运算符。因此,如果您有嵌套的数据结构,您可以编写
my $name = $system->{$ip_address}{name}[2]
而不是
my $name = $system->{$ip_address}->{name}->[2]
我不明白你为什么对我感到舒服
my $vlan = $_->{vlan}
但是
$wantedips->{$cidr} = $vlan
给您带来麻烦?两者都使用相同的语法来使用哈希引用访问哈希元素
间接运算符->
用于将键、索引或参数应用于引用