【问题标题】:Number and string concatenation in PerlPerl 中的数字和字符串连接
【发布时间】:2019-11-20 21:30:58
【问题描述】:

我是 Perl 的新手。我想用. 运算符连接一个字符串和一个数字,第一个参数将是一个数字。我可以使用 join、sprintf 并简单地将它们打印为打印数字、字符串。但我用. 运算符试了一下,得到了以下结果:

$foo = "hello".34 # Gives hello.34
$foo = 34."hello" # Gives an error
$foo = 34.34 # Gives 34.34
$foo = 34.34.34 # Gives """
$foo = "hello".34."hello" # Gives an error

我在 Perl 调试器下试过了。

为什么 Perl 不将数字和字符串连接起来,将数字作为第一个参数,反之亦然?为什么 34.34.34 在 Perl 中会给出 """?

【问题讨论】:

  • 你确定"hello".34 真的给出了hello.34(带有句号)吗?在命令行(Linux,Ubuntu MATE 20.04 (Focal Fossa))上,perl -le 'print "hello".34 ' 输出 hello34(没有句号)。

标签: perl concatenation


【解决方案1】:

时不时地,空白很重要。 34 . "hello""34hello"34."hello" 是一个解析错误,因为34. 看起来像一个浮点数的开头(可能是34.5),然后解析器在得到" 而不是另一个数字时不知道该怎么做.如果您在点运算符周围使用空格,您的代码无论如何都会看起来更好,但在数字之后它是必需的

34.34.34 是一种称为version string 或“v-string”的特殊结构,当您有一个包含多个点的数字时出现,可以选择在前面加上v。它创建一个字符串,其中每个字符 number 来自 v-string 中的数字。所以34.34.34 等于chr(34) . chr(34) . chr(34),并且由于chr(34) 是双引号,这与'"""' 相同。 V-strings 很有用,因为它们比较版本号的预期方式。数字上是5.10 < 5.9,但作为版本,5.10.0 gt 5.9.0

【讨论】:

  • 感谢您的回答。下次我自己怎么能找到答案。它在文档中可用吗?这对我会有帮助。 @hobbs
  • @Wordzilla 尽可能多地阅读 perldocs,尤其是 perlsynperldataperlop 对于这些内容:)
  • 谢谢@hobbs 我猜它在 Perlop 中不可用。它将其显示为用于连接的二元运算符,并且不处理这种情况。您在文档中的答案的确切来源或引用将非常有帮助。
  • 实际上,文档中并没有真正涉及到这种歧义。在perltrap 中提到了. 字符的连接和数字角色之间可能会混淆的可能性,但它没有提到OP 的具体情况,也没有提到如何用空格来改善它。
【解决方案2】:

很好的问题。 . 字符有多种含义:

  1. 是连接运算符

    my $x = 34;
    my $y = 34;
    say $x.$y; # 3434
    
  2. 它是浮点数字文字中的小数分隔符:

    3434 / 100 == 34.34
    

    请注意,小数分隔符必须紧跟在整数部分之后,否则会被解释为串联:34 .34 == 3434

  3. 它是 v-strings 中的分隔符(其中“v”通常代表版本)。在 v-string 中,每个字符由句点分隔,并且可选地以 v 为前缀:

    34.34.34 eq v34.34.34
    

    每个数字都被翻译成相应的字符,例如64.64.64 eq "@@@".

【讨论】:

  • 谢谢@amon 的回答。我怎样才能自己找到答案。它在文档中找到吗?我现在有编程 Perl。如果您在答案中提供来源或链接,将会非常有帮助。
  • @Wordzilla hobbs 已将手册页的名称作为评论发布在他的回答下,您也可以通过 perldoc.perl.org 在线阅读它们(只需在搜索字段中输入页面名称)。
猜你喜欢
  • 2012-04-08
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 2021-11-30
  • 1970-01-01
  • 2015-04-14
相关资源
最近更新 更多