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

时间:2010-11-13 16:31:16

标签: perl

我目前正在学习Perl中的“解除引用”,需要您帮助理解下面一行中的“\”含义。

$ra = \$a; 

4 个答案:

答案 0 :(得分:25)

正如我之前在其他地方写过的那样......

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

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

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

以下是一些例子:

$scalarref = \$foo;
$constref  = \186_282.42;
$arrayref  = \@ARGV;
$hashref   = \%ENV;
$coderef   = \&handler;
$globref   = \*STDOUT;

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

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

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

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

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

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

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

如果您使用散列尝试此操作,结果将包含对值的引用(正如您所期望的那样),但引用复制键(因为您可能不< / em>期待)。

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

@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

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

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

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

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

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

在这方面,反斜杠的行为类似于命名的Perl列表 运算符,例如printreversesort 无论左边可能发生什么,都可以提供他们右边的列表上下文。与命名列表运算符一样,使用显式scalar来强制标量上下文中的内容:

$dateref = \scalar localtime();    # \"Sat Nov 13 10:41:30 2010"

现在你知道......故事的休息

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

答案 1 :(得分:18)

请参阅perlop

  

一元“\”创建一个引用   无论如何。见perlreftut   和perlref。不要混淆这个   行为与行为   但是,字符串中的反斜杠   两种形式都传达了这一概念   保护下一件事   内插。

答案 2 :(得分:4)

Perl文档非常好用,并且经常使用它。我可以推荐perldoc perlreftut,perl参考教程或perldoc perlref以获取更多信息。之后perldoc perlintroperldoc perltocperldoc perl查看从那里开始的地方。

是的,它创建了对变量$ a的引用,并将其存储在变量$ ra。

答案 3 :(得分:0)

它在右侧创建对变量的引用;有点像C中的指针(没有指针算术)或Java中的指针。

有关此主题的更多信息,请参阅perldoc perlref

通过$$a对标量进行去分化,对@$a进行数组等等。