Perl中的'\'是什么意思?

Roy*_*Roy 23 perl

我目前正在学习Perl中的"解除引用",需要您帮助理解下面这行中的"\"含义.

$ra = \$a; 
Run Code Online (Sandbox Code Playgroud)

tch*_*ist 25

正如我之前在其他地方所写的......

一元\创建对其后面的任何内容的引用.在列表中使用时,它会创建一个引用列表.

不要将这种行为与字符串中的反斜杠行为混淆,尽管这两种形式确实传达了隐含的否定概念,即保护下一个东西免于解释.这种相似之处并非完全偶然.

您可以使用反斜杠创建对任何命名变量或子例程的引用.您也可以在匿名标量值上使用它,7或者"camel",尽管您不经常需要.该运算符的工作方式类似于&C或C⁺⁺中的(address-of)运算符,至少乍看之下.

这里有些例子:

$scalarref = \$foo;
$constref  = \186_282.42;
$arrayref  = \@ARGV;
$hashref   = \%ENV;
$coderef   = \&handler;
$globref   = \*STDOUT;
Run Code Online (Sandbox Code Playgroud)

反斜杠操作符不仅可以生成单个引用.如果应用于列表,它将生成一个完整的引用列表.

如前所述,反斜杠运算符通常用于单个引用,以生成单个引用,但不一定如此.当在对象列表上使用时,它会生成相应引用的列表.以下示例的第二行与第一行的作用相同,因为反斜杠会自动分布在整个列表中.

@reflist = (\$s, \@a, \%h, \&f);     # List of four references
@reflist = \($s,  @a   %h,  &f);     # Same thing
Run Code Online (Sandbox Code Playgroud)

如果带括号的列表只包含一个数组或散列,则会对其所有值进行插值并返回每个值:

@reflist = \(@x);                    # Interpolate array, then get refs
@reflist = map { \$_ } @x;           # Same thing
Run Code Online (Sandbox Code Playgroud)

当有内部括号时也会发生这种情况:

@reflist = \(@x, (@y));              # But only single aggregates expand
@reflist = (\@x, map { \$_ } @y);    # Same thing
Run Code Online (Sandbox Code Playgroud)

如果您使用散列尝试此操作,结果将包含对值的引用(正如您所期望的那样),但是对键的副本的引用(正如您可能期望的那样).

因为数组和散列切片实际上只是列表,所以您可以反斜杠切片中的任何一个以获取引用列表.接下来的四行中的每一行都完全相同:

@envrefs = \@ENV{"HOME", "TERM"};         # Backslashing a slice
@envrefs = \@ENV{ qw<HOME TERM> };        # Backslashing a slice
@envrefs = \( $ENV{HOME},  $ENV{TERM} );  # Backslashing a list
@envrefs = ( \$ENV{HOME}, \$ENV{TERM} );  # A list of two references
Run Code Online (Sandbox Code Playgroud)

由于函数可以返回列表,因此可以对它们应用反斜杠.如果你有多个函数要调用,首先将每个函数的返回值插入一个更大的列表,然后反斜杠整个事情:

@reflist = \fx();
@reflist = map { \$_ } fx();                # Same thing

@reflist = \( fx(), fy(), fz() );
@reflist = ( \fx(), \fy(), \fz() );         # Same thing
@reflist = map { \$_ } fx(), fy(), fz();    # Same thing
Run Code Online (Sandbox Code Playgroud)

反斜杠运算符始终为其操作数提供列表上下文,因此这些函数都在列表上下文中调用.如果反斜杠本身处于标量上下文中,则最终会引用该函数返回的列表的最后一个值:

@reflist = \localtime();      # Ref to each of nine time elements
$lastref = \localtime();      # Ref to whether it’s daylight savings time
Run Code Online (Sandbox Code Playgroud)

在这方面,反斜线行为类似于Perl的命名列表操作符,比如print,reversesort,总是对他们提供了一个列表环境权无论在什么可能会在他们的左边发生.与命名列表运算符一样,使用显式scalar来强制标量上下文中的内容:

$dateref = \scalar localtime();    # \"Sat Nov 13 10:41:30 2010"
Run Code Online (Sandbox Code Playgroud)

而现在你知道...... 故事的其余部分.

                         (向已故的保罗哈维道歉)

  • 我刚刚使用对\\*DATA的DATA引用来将Template :: Toolkit与LaTeX一起使用.我把LaTeX部分放在DATA部分,然后在`process`中使用它作为模板的引用:Perl太酷了. (2认同)
  • 还要感谢显示\\(...)分发,为每个元素创建一个引用.我会猜到会对该列表的数组进行引用,但现在这是有意义的,否则我们需要什么.谢谢 (2认同)

Eug*_*ash 18

perlop.

一元"\"创建对其后的任何内容的引用.见perlreftutperlref.不要将此行为与字符串中的反斜杠行为混淆,尽管两种形式都传达了保护下一个内容不受插值的概念.

  • 实际上,或者在列表上下文中创建几个引用以后的几个引用,例如*`@r = \\(@ a,%b,&c)`和`@r =\localtime`. (4认同)