被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

我得到了以下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被传递给$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
给您带来麻烦?两者都使用相同的语法来使用哈希引用访问哈希元素

间接运算符
->
用于将键、索引或参数应用于引用