我知道 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};
有人可以解释一下它们的区别以及何时使用它们。
答案 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中所期望的那样,如果我们想要引用某种东西,那么有几种方法可以得到一种东西:
*
)运算符专门获取参考。我们可以使用三种类型的变量(标量,哈希,数组)中的任何一种以及子例程(请记住,子例程的符号为\
)来执行此操作。这是引用标量变量的唯一方法。以下是每个示例:
&
有三种不同的方式可以“取消引用”(跟随指针)引用。
以下是示例:
# 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
是一个很好的教程,它详细介绍了我在此处概述的内容。