Perl中的数字和字符串连接

Perl中的数字和字符串连接,perl,concatenation,Perl,Concatenation,我是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" #

我是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中会给出“”?

有时,空白是重要的。
34。“hello”
“34hello”
34。“hello”
是一个解析错误,因为
34。
看起来像是浮点数的开始(可能是
34.5
),然后当解析器得到一个
而不是另一个数字时,它不知道该做什么。如果在点运算符周围使用空格,代码看起来会更好,但后面必须有数字


34.34.34
是一种称为a或“v字串”的特殊结构,当一个数字中有多个点时,会出现这种结构,可以选择前面有一个
v
。它创建一个字符串,其中每个字符数来自v字符串中的数字。因此
34.34.34
等于
chr(34)。chr(34)。chr(34)
,由于
chr(34)
是一个双引号,这与
相同““”
。V字串很有用,因为它们比较版本号预期使用的方式。从数字上看,
5.10<5.9
,但作为版本,
5.10.0 gt 5.9.0
这是一个很好的问题。
字符有多种含义:

  • 这是连接运算符

    my $x = 34;
    my $y = 34;
    say $x.$y; # 3434
    
  • 它是浮点数字文本中的十进制分隔符:

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

  • 它是v字符串中的分隔符(其中“v”通常表示版本)。在v字串中,每个字元以句点分隔,并可选择以
    v
    作为前缀:

    34.34.34 eq v34.34.34
    
    每个数字都被转换为相应的字符,例如
    64.64.64 eq“@@@@”


  • 谢谢你的回答。下次我自己怎么能找到答案呢。文档中有吗?这对我会有帮助的@hobbs@Wordzilla尽可能多地阅读perldocs,尤其是
    perlsyn
    perldata
    perlop
    ,了解这些内容:)谢谢@hobbs,我想perlop中没有。它将其显示为用于串联的二进制运算符,而不处理这种情况。在文档中你的答案的确切来源或引证将非常有用。实际上,文档中并没有太多涉及这种模糊性。在
    perltrap
    中,提到了
    字符的连接和数字角色之间可能存在的混淆,但没有提到OP的具体情况,也没有提到如何使用空格来改善。谢谢@amon的回答。我怎样才能自己找到答案。在doc里找到了吗?我现在有了Perl编程。如果您在回答中提供源代码或链接,这将非常有帮助。@Wordzilla hobbs已将手册页的名称作为其答案下的注释发布,您也可以在上在线阅读(只需在搜索字段中键入页面名称)。您确定
    “hello.34
    确实给出了
    hello.34
    (带句号)?在命令行(Linux,)上,
    perl-le'打印“hello”.34'
    输出
    hello34
    (不带句号)。