【问题标题】:What does '\' mean in Perl?'\' 在 Perl 中是什么意思?
【发布时间】:2010-11-13 16:31:15
【问题描述】:

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

$ra = \$a; 

【问题讨论】:

  • 如果您目前正在学习它,您的书籍和手册是怎么说的?
  • 我的讲义没有详细说明是什么意思,导致我在google上搜索。没有找到满意的答案,所以我在这里问。
  • @Roy:确保你选择了正确的答案。 ☹
  • 使用 Google 搜索 Perl 信息并不是一个好主意。有很多网站提供不可靠的 Perl 建议。当您有 Perl 问题时,我建议您在 perldoc.perl.org 搜索 Perl 文档。正如 tchrist 下面所展示的,您接受了一个不准确的答案。
  • @Roy:你应该问问你的讲师,为什么你从来没有被告知在哪里可以找到official Perl documentation,它包含了你需要的所有参考信息。你不需要去谷歌搜索这样的东西;你在那里找到的答案是不可靠的。

标签: perl


【解决方案1】:

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

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

不要将此行为与字符串中的反斜杠行为混淆,尽管这两种形式都传达了一种含糊否定的概念,即保护下一个事物不被解释。这种相似之处并非完全偶然。

您可以使用反斜杠创建对任何命名变量或子例程的引用。您也可以在匿名标量值上使用它,例如 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

如果您尝试使用哈希,结果将包含对值的引用(如您所料),但对键的 副本 的引用(您可能不 期待)。

因为数组和哈希切片实际上只是列表,所以您可以对其中任何一个切片进行反斜杠以获得引用列表。接下来的四行中的每一行都做同样的事情:

@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"

现在你知道了……故事的其余部分

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

【讨论】:

  • 我只是使用了对 DATA 的引用和 \*DATA 来使用带有 LaTeX 的 Template::Toolkit。我将 LaTeX 部分放在 DATA 部分中,然后在 process 中使用对它的引用作为模板:Perl 太酷了。
  • 也感谢您展示 \( ... ) 分布,为每个元素创建一个引用。我猜想这会对该列表的数组进行引用,但现在这是有道理的,否则我们需要什么 [ ... ] 。谢谢
  • 真的很全面,就是tchrist。
  • @Joel,最后一次引用DATA,那是昨天,我在命令行中传入"&lt;&amp;DATA",由“脚本执行的正常&lt;&gt; 过滤器处理中的“魔术打开”。这并不是本身的参考。 ☺
  • 哇,我将不得不考虑一下那个!我只是说我正在学习“2 级”Perl,很高兴看到你可以用它做所有这些疯狂的体操。
【解决方案2】:

perlop

一元“\”创建一个引用 任何跟随它。见perlreftutperlref。不要混淆这个 行为与行为 字符串中的反斜杠,虽然 两种形式都传达了 保护接下来的事情 插值。

【讨论】:

  • 实际上,或者创建了对列表上下文中以下几项内容的多个引用,例如@r = \\(@a, %b, &amp;c)@r = \localtime
  • 当正则表达式或字符串中有反斜杠“\”时称为ESCAPE,否则称为REFERENCE
【解决方案3】:

Perl 文档很棒而且很详尽,请尽早并经常使用它。我可以推荐perldoc perlreftut,perl 参考教程,或者perldoc perlref 以获得更多信息。然后perldoc perlintroperldoc perltocperldoc perl 看看从那里去哪里。

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

【讨论】:

    【解决方案4】:

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

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

    通过$$a 对标量、@$a 对数组等进行解引用。

    【讨论】:

    • @tchrist 这个答案没有错。它并没有完全告诉你 \ 做了什么,但问题不是“\ 运算符在所有情况下都做了什么”,而是“'\' 在下面一行中的含义”。下面的行是$ra = \$a;,在该行中它确实创建了对右侧变量的引用。答案还点了一份参考文档,充分解释了操作符。
    • @Chas。欧文斯:这是对这个问题标题的不完整回答。
    • 好吧,我猜在$ra = \$a;这一行上,没有创建对右侧变量的引用;P
    猜你喜欢
    • 2018-03-05
    • 2010-12-28
    • 2023-03-25
    • 2020-05-21
    • 1970-01-01
    • 2011-09-15
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多