perl-$符号的用法

时间:2019-07-16 18:47:22

标签: perl hash syntax

我知道 const pythonProcess = spawn('python', ['filepath/to/main.py', '--option', 'argument1', 'parameter', 'multiple word argument', 'argument2']). $@用于声明标量,数组和哈希。但是,当%用于声明其他类似的东西时,我感到困惑

$

和以下语法的用法

my %myhash1 = ( a => 1,  b => 2 );
my $myhash2 = { A => 27, B => 27};

有人可以解释一下它们的区别以及何时使用它们。

2 个答案:

答案 0 :(得分:1)

否,这些信息指的是访问方式。 $表示单个元素,@表示多个元素,%表示键/值对。演示:

不涉及任何引用

$myhash1{a}             # 1
@myhash1{qw(a b)}       # (1, 2)
%myhash1{a}             # (a => 1)

涉及参考

$$myhash2{A}            # 27
@$myhash2{qw(A B)}      # (27, 27)
%$myhash2{A}            # (A => 27)

这只是简写

${ $myhash2 }{A}        # 27
@{ $myhash2 }{qw(A B)}  # (27, 27)
%{ $myhash2 }{A}        # (A => 27)

使用-> deref运算符

可以更清楚地编写
$myhash2->{A}           # 27
$myhash2->@{qw(A B)}    # (27, 27)
$myhash2->%{A}          # (A => 27)

首选最后一块中显示的符号。


缺少下标大括号:

  • %myhash1的意思是:哈希中的所有k / v对。
  • 任何%$myhash2%{ $myhash2 }$myhash2->%*的意思是:取消引用的哈希中的所有k / v对。

答案 1 :(得分:0)

Perl 5 信号($,@和%)可能会造成混淆。这是一个简短的解释。 (Perl 6规则不同,我在这里略过。正如@ikegami所指出的那样,还有一些其他功能(例如哈希和数组切片)也为简洁起见而略过。)

美元符号”符号“ 总是”表示“我正在处理标量值”。因此,变量$foo是一个包含单个标量值的变量(在某些情况下,标量实际上包含在不同上下文中访问的多个不同内容,但这对于我们感兴趣的内容并不重要。现在)。

当您访问数组和哈希元素时,这是正确的:$foo[0]说:“我正在访问在数组{{1的元素0中找到的标量值 }}。对于散列,@foo说:“我正在访问在散列$foo{'bar'}中键为bar的元素中找到的标量值

符号符号表示整个数组 %foo的意思是“名称为@foo的所有数组”。 (在这里跳过切片;它们是一种从哈希或数组中立即获取事物列表的方法。确实有用,但它们现在会掩盖我们的观点。)

类似地,百分号表示整个哈希 foo是名为%foo的散列-一次全部散列。 (与哈希片相同)。

这些都是Perl中的所有基本数据类型:标量(foo),数组($)和哈希(@)。还有%sub-函数)类型,我们将在下面进一步讨论,而glob(&-不在此答案的范围内,因此我们将也跳过它们。)

如果我们想要更复杂的嵌套数据结构,我们现在必须继续使用引用

从本质上讲,引用实际上是一个知道其指向内容的指针。引用总是 标量。正如我们在Perl 5中所期望的那样,如果我们想要引用某种东西,那么有几种方法可以得到一种东西:

  • 使用反斜杠*)运算符专门获取参考。我们可以使用三种类型的变量(标量,哈希,数组)中的任何一种以及子例程(请记住,子例程的符号为\)来执行此操作。这是引用标量变量的唯一方法。
  • 使用匿名构造函数之一构建对哈希或数组的引用。
  • 使用匿名子例程内联构造一个子例程(函数)引用。

以下是每个示例:

&

三种不同的方式可以“取消引用”(跟随指针)引用。

  1. 使用 stacked 标记。这些从右到左阅读;每个标记都再次取消引用变量。最常用于取消标量引用。通常,您只会看到两个,但是有时一次要进行多个级别的解引用才能遍历标量值链。堆叠的信号可能会造成混淆,主要是因为它们在从左到右阅读的语言中添加了从右到左的解释。
  2. 使用标记符和成对的括号。这在逻辑上等同于使用parens消除歧义。括号内的内容被取消引用为括号外的类型。最常用于从引用中获取聚合类型。
  3. 使用一系列链接的解除引用运算符。每个取消引用都意味着左侧是一个标量引用,因此连续数行意味着每个取消引用的结果都是另一个(标量)引用。深入挖掘结构以查找内容的方便。

以下是示例:

# Define a reference to a scalar
$foo = \$bar;

# Define a reference to an array, a hash and an existing subroutine:
$x = \@w;
$y = \%zorch;
$z = \&do_stuff;

# define anonymous arrays, hashes, and subs:
$my_array = [2, 3, 'fred', 'hoplite'];
$my_hash  = {foo => 'bar', baz => 'quux'};
$pi_sub   = sub { return 3.14 };

允许使用任何嵌套组合,因此,例如,我们可以拥有一个由多个sub哈希组成的数组的哈希。

Subs是一种特例,因为我们可以做的就是复制它们的引用,或称它们为:

# Dereference a scalar using stacked sigils.
print $$foo; # $foo is a reference to the scalar $bar
             # the second $ says "please give me the value of the scalar
             $ I now have" (in this case that's $bar).

# Use braces and sigils to dereference a scalar, getting a hash/array
%hash = ( a => 1, b => 2);
my %thing = %{ $my_hash }; # dereference the scalar
                           # copy the resulting hash into %thing

# Chained dereferences
# A hash of hashes:
$sample = { one => { a => 1, b => 2}, two => { aa => 4, bb => 8 }};
# To get to 8, we need to dereference twice:
$eight = $sample->{two}->{bb};

# Note that we can collapse the chain after the first deref.
$same_result = $sample->{two}{bb}

# If we wanted to get an element from $my_hash, we don't have to
# dereference it and construct the new hash. We can just use the 
# dereference operator.
$x = $my_hash->{a} == $thing{a}; # $x is 1 (true).

$pi_times = sub { my $x = shift; return 3.14159 * $x }; $the_sub = $pi_times; $z = $the_sub->(4); # calls the $pi_times anonymous sub # returns pi * 4 手册页对此进行了详细介绍; perldoc perlre是一个很好的教程,它详细介绍了我在此处概述的内容。