与perl中的非变量东西连接

时间:2016-08-31 14:08:03

标签: perl concatenation

我需要将map结果与字符串相连接。

perl -le 'print (map { (q(a)..q(z))[rand(26)] } 1..3) . "123"'

预期3个随机符号和123。但是没有123只有3个随机符号。 一般来说,我需要在那里添加一个变量。

4 个答案:

答案 0 :(得分:3)

警告:

print (...) interpreted as function at -e line 1.
Useless use of concatenation (.) or string in void context at -e line 1.

这是因为您的代码具有以下形式:

print(...) . "123"

解决方案:

perl -le'print( map( { (q(a)..q(z))[rand(26)] } 1..3 ) . "123" )'   # Fully parenthesized
perl -le'print map( { (q(a)..q(z))[rand(26)] } 1..3 ) . "123"'      # Opt parens dropped
perl -le'print( ( map { (q(a)..q(z))[rand(26)] } 1..3 ) . "123" )'
perl -le'print +( map { (q(a)..q(z))[rand(26)] } 1..3 ) . "123"'    # "Disambiguated"

除了那些也不对。虽然他们解决了你问的问题,但他们揭示了第二个问题。它们总是打印3123,因为标量上下文中的map返回它在列表上下文中返回的标量数。

解决方案:

perl -le'print( map( { (q(a)..q(z))[rand(26)] } 1..3 ), "123" )'         # . => ,
perl -le'print map( { (q(a)..q(z))[rand(26)] } 1..3 ), "123"'            # . => ,
perl -le'print( ( map { (q(a)..q(z))[rand(26)] } 1..3 ), "123" )'        # . => ,
perl -le'print +( map { (q(a)..q(z))[rand(26)] } 1..3 ), "123"'          # . => ,
perl -le'print join "", ( map { (q(a)..q(z))[rand(26)] } 1..3 ), "123"'  # join

答案 1 :(得分:2)

这里有一些有趣的事情。首先,让我们通过打开警告让Perl帮助追查任何问题。

$ perl -Mwarnings -le 'print (map { (q(a)..q(z))[rand(26)] } 1..3) . "123"'
print (...) interpreted as function at -e line 1.
Useless use of concatenation (.) or string in void context at -e line 1.
lfy

那里有两个警告。让我们看看他们两个。

  

print(...)解释为函数

如果print(或任何其他列表运算符)后面的第一个非空格字符是左括号,则Perl假定您要将print作为函数调用,它将查找平衡右括号以结束print的参数列表。

  

无效使用串联(。)或void上下文中的字符串

因为print调用假设以右括号结束,. "123"并没有做任何有用的事情。因此被忽略了。

告诉Perl左括号不标记函数调用的标准方法是使用+

$ perl -Mwarnings -le 'print +(map { (q(a)..q(z))[rand(26)] } 1..3) . "123"'
3123

好吧,我们丢失了警告。但我们得到了'我们希望看到三个符号。我们现在在这里基本上是这样的:

print +(map ...) . "123";

由于连接,在标量上下文中调用map。在标量上下文中,map不再返回值列表,而是返回该列表的大小(在这种情况下为整数-3)。

对此的修复是用逗号替换.,因此在列表上下文中调用map

$ perl -Mwarnings -le 'print +(map { (q(a)..q(z))[rand(26)] } 1..3), "123"'
ntg123

所以你被a烧毁了,括号没有做你想要他们做的事情,b)map在标量语境中被调用。

答案 2 :(得分:0)

perl -le 'print join("",map { (q(a)..q(z))[rand(26)] } 1..3) . "123"'

答案 3 :(得分:0)

将整行打印在括号内,并使用逗号作为分隔符:

perl -le 'print ( (map { (q(a)..q(z))[rand(26)] } 1..3) , "123")'