【问题标题】:Perl variable interpolation rules for %vars versus $vars [duplicate]%vars 与 $vars 的 Perl 变量插值规则 [重复]
【发布时间】:2013-08-13 21:15:38
【问题描述】:

即使它是在双引号中,并且%s 应该被插入到一个不存在的散列中,这是有效的 Perl 并输出 "confusing = true"

#!/usr/bin/perl -w
use strict;

my $what = "confusing = %s";
printf $what, "true";

但是,这是无效的(如预期的那样),因为 $s 不存在:

my $what = "confusing = $s";

【问题讨论】:

  • 谢谢 pilcrow。我将以 Nathan Torkington 的引述作为答案。 “最大的问题是 % 在 printf 的双引号字符串中大量使用。”
  • @pilcrow 不相关;请注意,这是对printf 的调用,它以特定的、定义的方式处理其格式字符串中的%s,而不是对print 的调用,其中%s 是有问题的并且适用于托金顿的格言。
  • @AaronMiller,OP 的真正问题涉及一个双引号字符串 ("%s") 中的变量与另一个双引号字符串中的变量的语义("$s")。 OP 对字符串的处理——将它们用作 printf 的参数等——并不重要。
  • @pilcrow 当然是! printf 解释 %s,并赋予它行为,这对于熟悉该功能的任何人来说都是完全可以预期的; print 没有,并且给了它行为,不熟悉 Perl 的人可能会感到惊讶。

标签: perl string-interpolation


【解决方案1】:

你说 %s 应该被插入到一个不存在的哈希”,但它不应该。没有散​​列插值。不过在 Perl 6 中是可能的。

【讨论】:

    【解决方案2】:

    此外,哈希不会插入双引号中;标量(包括哈希元素)和数组。

    【讨论】:

      【解决方案3】:

      您将一个格式说明符和一个值传递给printf,它的行为符合预期;这可能看起来像哈希插值,但实际上并非如此。

      有关格式说明符的详细信息,请参阅perldoc -f sprintf;简而言之,格式说明符中的%s 表示应将值内插为字符串,在这种情况下效果与print "confusing = $what" 相同。

      如果将printf 替换为print,则%s 将按字面意思表示,而不是作为变量插值,结果将是confusing = %s;这是适用于托金顿格言的情况,而不是对printf 的调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 2015-02-20
        • 1970-01-01
        • 2020-02-29
        • 2021-10-03
        相关资源
        最近更新 更多