Perl获取小代码的秘诀是什么?

时间:2010-04-11 12:31:39

标签: perl obfuscation

我见过很多(代码高尔夫)Perl程序,即使我看不懂它们(不知道Perl)我想知道你怎么能设法得到这么少的代码去做什么在其他一些编程语言中需要20行。

  • Perl的秘诀是什么?是否有一种特殊的语法允许您在几次击键中执行复杂的任务?它是正则表达式的混合吗?

我想学习如何编写功能强大而又简短的程序,就像你从代码高尔夫挑战中所知道的那样。什么是最好的开始?我不想学习“干净”的Perl - 我想编写脚本,即使我在一周后不再理解

如果还有其他编程语言,我可以写更短的代码,请告诉我。

7 个答案:

答案 0 :(得分:32)

有许多因素使Perl适合打高尔夫球:

  • 无数据输入。值可以互换为字符串和数字。
  • “对角线”语法。通常被称为TMTOWTDI(有多种方法可以做到。)
  • 默认变量。如果未指定参数,则大多数函数将作用于$_。 (一些行为 在@_上。)
  • 带有多个参数的函数(如split)通常具有默认值 让你省略一些论点甚至所有论点。
  • “神奇”的readline运算符<>
  • 高阶函数,例如mapgrep
  • 正则表达式已集成到语法中(即不是单独的库)
  • 短路运算符返回最后测试的值。
  • 短路操作员可用于流量控制。

此外,没有限制(默认情况下是关闭的):

  • 您无需声明变量。
  • Barewords自动引用字符串。
  • undef会变为0'',具体取决于具体情况。

现在已经不在了,让我在一点上非常清楚:

高尔夫是一种游戏。

很高兴渴望达到可以让你擅长的perl-fu水平,但是以$DIETY的名义,不要打高尔夫练习代码。首先,这是浪费时间的可怕浪费。你可能花一个小时试图修剪几个角色。高尔夫代码是脆弱的:它几乎总是做出重大假设,并且轻率地忽略错误检查。真正的代码不能这么粗心。最后,作为程序员的目标应该是编写清晰,健壮且可维护的代码。在编程中有一种说法:总是编写代码,好像维护代码的人是一个知道你住在哪里的暴力反社会人士。

所以,一定要开始打高尔夫球;但是要意识到它只是在玩耍并对其进行处理。

答案 1 :(得分:10)

大多数人都忽略了Perl语法和默认运算符的重点。 Perl主要是一种“DWIM”(我的意思是)语言。其中一个主要的设计目标是“让常见事物变得简单,让事情变得更加困难”。

作为其中的一部分,Perl设计师谈论语法的霍夫曼编码,并思考人们需要做什么而不是仅仅给他们低级原语。你经常做的事情应该是最少的打字,功能应该像最常见的行为。这节省了相当多的工作。

例如,split有许多默认值,因为有一些用例可以使用常见案例。如果没有参数,split会在空格上分解$_,因为这是一种非常常见的用法。

 my @bits = split;

有点不太常见但仍然常见的情况是在其他内容上分解$_,因此版本稍长一些:

 my @bits = split /:/;

而且,如果您想明确说明数据源,您也可以指定变量:

 my @bits = split /:/, $line;

想想这就像你通常会处理生活一样。如果你有一个经常执行的常见任务,比如与你的调酒师交谈,那么你可以通过简写来解决这个问题:

  

通常的

如果你需要做一些稍微不同的事情,你可以稍微扩展一下:

  

通常,但洋葱

但你总能记下具体细节

  

肮脏的孟买蓝宝石马提尼酒不动摇了

下次浏览网站时请考虑一下。您执行常规操作需要多少次点击?为什么有些网站易于使用而有些网站却没有?大多数时候,好的网站要求你做最少的工作来做常见的事情。与我的银行不同,它需要不少于13次点击才能进行信用卡账单支付。给他们钱应该很容易。 :)

答案 2 :(得分:8)

这不回答整个问题,但是在编写代码方面你将无法在几天内阅读,这里有一些语言可以鼓励你写短信,几乎无法读取的代码:

答案 3 :(得分:7)

Perl有很多单字符特殊变量提供了很多快捷方式,例如$. $_ $@ $/ $1等。我认为这是结合内置的正则表达式,允许您编写一些非常简洁但不可读的代码。

答案 4 :(得分:4)

Perl的special variables($ _,$。,$ /等)通常可用于缩短代码(并且更加模糊)。

答案 5 :(得分:1)

我猜这个“秘密”是为经常重复的任务提供原生操作。

在最初为您设想的perl域中,您经常需要

  • 按行输入
  • 剥离空白
  • 将行翻译成单词
  • 关联数据对
  • ...

和perl简单提供了运算符来做这些事情。短变量名称和许多东西的默认值的使用只是肉汁。

perl也不是第一种走这条路的语言。 perl的许多功能都是从sed和awk以及各种外壳中被删除或多或少完整(或经常略微改进)。拉里很好。

当然perl不是最后一个这样的方式,你会在python和php以及ruby中找到类似的功能......人们喜欢这些结果并且不想放弃它们只是为了获得更多的常规语法

答案 6 :(得分:-2)

Java只在一行中复制变量的秘诀是什么,而不用担心总线和内存?答:代码转换为更大的代码。对于所发明的每种语言都是如此。