被Perl中的局部变量和方法所困惑

时间:2014-07-09 09:35:32

标签: 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 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 的新手。

2 个答案:

答案 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" }