2012-09-01 37 views
6

我看到一个Perl一个衬垫,以生成8个字符的一些随机字符串:为什么我需要在下面的perl one liner中使用大括号?

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

但这并不没有{}在地图工作。这是为什么?

+0

究竟是什么代码没有工作?它可以不用'{}'来完成。 – aschepler

+1

@aschepler:是的,但是如果您删除了大括号,那么您需要在该块和列表之间添加逗号。 –

回答

11

请参阅perldoc -f mapmap有两种形式:map({block} @array)map(expression, @array)。后一种形式,可以使用像这样:

perl -le 'print map(("a".."z")[rand 26], 1..5)' 
perl -le 'print map +("a".."z")[rand 26], 1..5' 

原因

perl -le 'print map ("a".."z")[rand 26], 1..5' 

不起作用的,因为它解析像

perl -le 'print(((map("a".."z"))[rand(26)]), 1..5)' 

换句话说,"a".."z"成为map的唯一参数,这是无效的。这可以用一组额外的括号或一个一元+来消除歧义。

+0

谢谢!说得通。 –

+0

一元+如何帮助那里?我看到它在文档链接提供的示例中提到,但不确定它是如何工作的。我可以谷歌是否避免函数调用中的括号是常见的事情? –

+1

@PalaceChan它是用来将'map'与第一个'(''分开的。这个技巧是常用的Perl使用函数,它需要多个参数 - 其他的包括'grep'和'print'。 – ephemient

相关问题