我需要将map
结果与字符串相连接。
perl -le 'print (map { (q(a)..q(z))[rand(26)] } 1..3) . "123"'
预期3个随机符号和123
。但是没有123
只有3个随机符号。
一般来说,我需要在那里添加一个变量。
答案 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")'