Perl特殊变量有什么好的做法?

时间:2009-08-18 16:41:04

标签: perl

首先,有没有人有一个全面的Perl特殊变量列表?

其次,使用它们是否更容易完成任务?我总是取消$/一次读取文件,$|自动刷新缓冲区,但我不确定是否有其他文件。

第三,应该使用Perl特殊变量,或者在编码时更明确。就个人而言,我是使用特殊变量来操纵代码行为方式的粉丝,但我听到其他人认为它只是混淆了事情。

6 个答案:

答案 0 :(得分:19)

它们都记录在perlvar

请注意,长名称仅在use English qw( -no_match_vars );首先使用时才可用。

答案 1 :(得分:7)

始终记得local'对标点符号变量进行更改。一些标点符号变量很有用,不应使用其他变量。例如,永远不应该使用$[(它会更改数组的基本索引,因此local $[ = 1;将导致1引用列表或数组中的第一项。像$"这样的其他人是不确定的。您必须平衡不必手动连接的有用性。例如,哪一个更容易理解?

local $" = " :: ";               #"
my $s = "@a / @b / @c\n";

my $sep = " :: ";
my $s = join(" / ", join($sep, @a), join($sep, @a), join($sep, @a)) . "\n";

my $s = join(" / ", map { join " :: ", @$_ }, \(@a, @b, @c)) . "\n";

答案 2 :(得分:5)

1)至于我经常使用的那些:

  • $!是IO错误处理的典型

  • $ @用于在调用设计错误的库(如数据库库)时进行eval错误处理,这些库的编码器不够体贴,以便在“die”之外进行正确的错误处理代码

  • $ _对于map / grep块,虽然我100%同意上面的海报,但将它用于常规代码并不是一个好习惯。

  • $ |用于冲洗缓冲区

2)至于使用标点符号与英文名称,我会选择上面的Marc Bollinger的回复,尽管对于任何人都认为使用英文名称没有任何好处也有同样的反驳。

  

“如果你使用Perl,你显然不会选择新手可读性”

Marc,我发现并不总是(或者几乎从不)真实。再说一遍,99%的Perl经验是为大公司编写生产Perl代码,其中90%是完整的应用程序而不是10行黑客脚本,所以我的分析可能不适用于其他领域。像Marc那样错误的原因是:

  • 仅仅因为我是Perl非初学者(说得温和一点),一年前聘请的一些noob分析师 - 或外包的“天才” - 可能不是。你可能不想让它们比现在更容易混淆。 “如果代码难以编写,那么应该很难阅读”在任何语言的专业开发人员的良好态度列表中都不是很高。

  • 当我凌晨2点起床,半睡半醒并解决生产问题时,我真的不想依靠我已经近乎盲目的眼睛区分的能力$之间!和$ |。特别是在前面提到的“天才”编写的代码中,他们可能不知道使用哪一个并将其切换。

  • 一年前,当我正在阅读一个未完成的代码时,一个人咳嗽“重组”咳嗽离开了公司而不是专注于比标点汤的可读性更复杂的错误逻辑。

答案 3 :(得分:4)

我使用最多的三个是$_@_$!

我喜欢在循环数组时使用$_,检索参数(如Motti指出的,实际上是@_)或执行替换:

例1.1:

foreach (@items)
{
  print $_;
}

例1.2:

my $prm1 = shift; # implicit use of @_ or @ARGV depending on context

例1.3:

s/" "/""/ig; # implicit use of $_

我在这种情况下使用$!

示例2.1:

open(FILE, ">>myfile") || die "Error: $!";

我确实同意,它使代码对于不熟悉Perl的人更加困惑。但是让别人感到困惑是了解这门语言的乐趣之一! :)

答案 4 :(得分:2)

我使用的典型产品是$_, @_, @ARGV, $!, $/。其他我评论很多。

布拉德指出$@也是一个非常常见的变量。 (来自eval()的错误值)。

答案 5 :(得分:0)

我说使用它们 - 如果你使用Perl,你显然不会选择它来获得初学者的可读性。任何非常随意的开发人员都可能打开浏览器/参考窗口,并且在一个窗口中筛选perlvar联机帮助页可能不比查找(和赋值给!)全局变量或外部变量的定义更加艰难。作为一个例子,我刚刚遇到了名为capture buffer的新的5.10.x:

/^(?<myName>.*)$/;
# and later
my $capture = %+{'myName'};

弄清楚发生了什么并不比进入parlvar / perlre并阅读一点点更难。

我更倾向于在未记录的代码中找到一堆古怪的特殊变量,而不是在未记录的代码中找到一堆古怪的算法。