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

sak*_*sak 13 obfuscation perl

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

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

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

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

Mic*_*man 32

Perl有很多因素可以使代码打高尔夫球:

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

此外,没有限制(默认为关闭):

  • 您不需要声明变量.
  • Barewords自动引用字符串.
  • undef成为0''取决于上下文.

既然这已经不在了,请让我在一点上非常清楚:

高尔夫是一场比赛.

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

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

  • Perl有数据输入.它只是不需要程序员告诉Perl类型是什么 - 它假定程序员将保持它们的直线. (3认同)

bri*_*foy 10

大多数人都忽视了Perl的语法和默认运算符.Perl主要是一种"DWIM"(我的意思是)语言.其中一个主要的设计目标是"让普通事物变得简单,让事情变得更加困难".

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

例如,拆分有许多默认值,因为有一些用例可以使用常见情况.没有参数,就split打破了$_空白,因为这是一种非常常见的用法.

 my @bits = split;
Run Code Online (Sandbox Code Playgroud)

有点不太常见,但仍然常见的情况是分解$_其他东西,所以有一个稍长的版本:

 my @bits = split /:/;
Run Code Online (Sandbox Code Playgroud)

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

 my @bits = split /:/, $line;
Run Code Online (Sandbox Code Playgroud)

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

通常

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

通常,但洋葱

但你总能记下具体细节

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

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


Mar*_*off 8

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


Tom*_*rys 7

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


Amy*_*y B -2

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