1
15
有时,最Perlish的做法是使用CPAN,而不是编写任何代码。 下面是一个使用 Net::CIDR::Lite 和 Net::IP::Match::Regexp :
免责声明:我刚刚说了出来,它只进行了最少的测试,没有基准测试。健全性检查、错误处理和注释省略以保持行计数。不过,我没有删减空白。 至于代码:在使用函数之前,不需要定义它们。 |
2
24
通过多年来看到C程序员编写的Perl代码,这里有一些通用的建议:
使用散列。使用列表。使用散列!使用列表!使用列表操作(map、grep、split、join),尤其是对于小循环。不要使用花哨的列表算法;pop、splice、push、shift和unshift更便宜。不要用树,大麻更便宜。哈希是便宜的,制造它们,使用它们,然后扔掉!对循环使用迭代器,而不是3-arg循环。不要称之为$var1、$var2、$var3;而是使用一个列表。不要称之为$var_foo、$var_bar、$var_baz;而是使用哈希。使用
不要使用原型,这是个陷阱!!
使用正则表达式,而不是
写
在需要时声明变量,而不是在子例程的顶部。使用严格。使用警告,并修复所有警告。使用诊断。编写测试。写吊舱。 使用CPAN。使用CPAN!使用CPAN!可能已经有人做得更好了。
跑
perlcritic
. 运行它
利用不用花在语言和调试内存分配上的时间来改进代码。 提问。优雅地对代码进行风格注释。去参加一个珠宝商会议。进入perlmunks.org。去yapc或perl研讨会。您的Perl知识将突飞猛进。 |
3
20
大多数编写“Perlish”的代码都将利用Perl中的内置函数。 例如,这:
我会重写如下内容:
上面发布的代码就是这样做的,但是有点干净。 您确定代码会满足您的需要吗?就我而言,如果IP后面的部分是>255,那么您只移动到IP的前一部分,这看起来有点奇怪。 |
4
14
另一个示例重写:
对此:
此外,在这里:
这里:
而不是
当然,您也可以使用Perl的
如前所述,尽量避免
总是
总是
总是总是
使您的代码在
|
5
13
当然,在Perl中这样做是一种方法。
这就是我实际实现它的方法。
|
6
6
我不能说这个解决方案会使您的程序更加Perl化,但它可能会简化您的算法。 不要将IP地址视为带点的四元、Base-256数字(它需要嵌套的if结构来实现递增函数),而应将IP地址视为32位整数。将A.B.C.D格式的IP转换为整数,并使用此(未测试):
现在很容易确定一个IP是否位于两个端点IP之间。只需做简单的整数算术和比较。
|
7
5
告诉你的同事,他们的Perl看起来太像线噪声了。请不要为了混淆而混淆您的代码——这是愚蠢的开发目标,当Perl是真正糟糕的程序员(显然,像您的同事一样)编写草率的代码时,这样的开发目标会让Perl因不可读而声名狼藉。良好的结构、缩进和逻辑代码是一件好事。C是件好事。 不过,说真的,要想知道如何编写Perl,最好的方法是在Damian Conway的O'Reilly“Perl最佳实践”中。它告诉你他认为你应该怎么做,他总是给他的立场很好的理由,偶尔也给你一些不同意的好理由。我在某些方面不同意他的观点,但他的推理是合理的。你和任何比康威先生更了解Perl的人合作的几率都很小,而且有一本印刷书(或者至少有一本Safari订阅书)可以为你的论点提供更坚实的支持。在阅读Perl食谱的同时,您可以找到它的副本,因为查看解决常见问题的代码示例可以帮助您找到正确的方向。我不喜欢说“买书”,但那些书是非常好的书 任何 Perl开发人员应该阅读。
关于您的特定代码,您使用的是foreach,
|
8
4
只有一个建议:严格使用。其余的几乎不相关。 |
9
3
我很清楚你的感受。我的第一种语言是FORTRAN,像一个优秀的FORTRAN程序员一样,我用每种语言编写了FORTRAN。 我有一本非常棒的书 Effective Perl Programming 我不时地重读。尤其是一个叫做“惯用Perl”的章节。下面是一些我用来让Perl看起来像Perl的东西:列出map和grep的操作符、slices和hash slices、引号操作符。 另一件使我的Perl看起来不像Fortran/C的事情是定期读取模块源代码,特别是那些主模块源代码。 |
10
2
你可以使用 Acme::Bleach 或 Acme::Morse |
11
2
虽然这是可行的:
如果可能的话,我会使用网络掩码,因为它会变得更简单:
试验
试验
输出:
|
12
1
而不是这样做:
你可以这样做:
另外,您可以使用 Fatal 模块,以避免检查资料是否有错误。 |
13
1
“我的代码看起来如何”的唯一标准是阅读和理解 目的 代码(尤其是不熟悉Perl的程序员),而不是它是否遵循特定的风格。 如果一个Perl语言特性使一些逻辑更容易理解,那么我就使用它,如果不是的话,我就不使用它——即使它可以用更少的代码来实现。 您的同事可能认为我的代码非常“非Perl”,但我敢打赌他们完全理解代码的作用,可以修改它来修复/扩展它,而不会有任何问题: 我的版本:
(注意:额外的“”行在那里是为了保留我的怪异间距,当在这里发布代码时,这些行会被破坏) |
14
0
我错过什么了吗…上面的任何阵列版本都可以工作吗?mods在for循环的局部变量上执行。我认为布拉德·吉尔伯特的网络:IP解决方案是我的选择。克里斯·卢茨几乎像我一样把剩下的洗干净了。 作为旁白,一些关于可读性的评论让我感到好奇。对于Erlang/Lisp语法的可读性,是否有更少的[强烈的]抱怨,因为它们只有一种方法可以编写代码? |
15
0
这可能更像C,但也更简单:
更新:我在阅读问题中的所有代码之前发布了这个。这里的代码只是增加IP地址。 |
Manny · 如何比较Perl中的字符串? 2 年前 |
BioRod · 我不能用Perl打印键和值 2 年前 |
user17227456 · Perl CLI代码无法追加字符串行 2 年前 |
LearnToBeBetter · 读取文件,搜索字符串,打印字符串 2 年前 |
KJ7LNW · 一些波斯语文本的宽字符印刷,但其他文本则没有 2 年前 |
con · 如何搜索大型数据结构并返回一系列给出特定值的键/数组? 2 年前 |
Pranay Nanda · 使用regex解析许可证文件 6 年前 |