代码之家  ›  专栏  ›  技术社区  ›  Justin

Perl特殊变量的良好实践是什么?

  •  4
  • Justin  · 技术社区  · 15 年前

    首先,是否有人有Perl特殊变量的全面列表?

    第二,有什么任务更容易使用吗?我总是不安 $/ 同时读取所有文件,以及 $| 自动刷新缓冲区,但我不确定是否还有其他缓冲区。

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

    6 回复  |  直到 10 年前
        1
  •  5
  •   scobi    10 年前

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

    • $!对IO错误处理至关重要

    • 当调用错误设计的库(如数据库库)时,其编码人员没有足够的考虑,无法以“die”以外的体面的错误处理进行编码时,eval错误处理为$@

    • $对于map/grep块,尽管我100%同意上面的海报,将其用于常规代码不是一个好的实践。

    • $用于冲洗缓冲器

    2)至于使用标点符号和英文名称,我会选择上面的MarcBollinger的回复,尽管同样的反驳也适用于那些认为使用英文名称没有好处的人。

    “如果您使用的是Perl,显然您不会选择它作为新手的可读性。”

    马克,我发现这并不总是(或者说几乎从不)真实的。另外,99%的Perl经验是为大公司编写生产Perl代码,90%的Perl代码是成熟的应用程序,而不是10行的黑客脚本,因此我的分析可能不适用于其他领域。像马克这样的想法是错误的原因是:

    • 仅仅因为我是一个Perl非新手(委婉地说),一年前雇来的Noob分析师——或者外包的“天才”——可能不是。你可能不想再把他们弄糊涂了。”如果代码很难编写,那么应该很难阅读“在任何语言的专业开发人员的良好态度列表上都不是很高。

    • 当我凌晨2点起床,半睡半醒,排除生产问题时,我 真的? 不想依靠我已经几乎瞎了眼睛的能力来区分美元!和$.尤其是在前面提到的“天才”编写的代码中,他们可能不知道要使用哪一个,然后将它们切换过来。

    • 当我读到一个未完成的代码时, 咳嗽 “重组” 咳嗽 一年前离开公司,我宁愿把精力集中在错综复杂的逻辑上,也不愿集中在标点符号汤的可读性上。

        2
  •  19
  •   Sinan Ünür    15 年前

    它们都记录在 perlvar .

    请注意,只有当您 use English qw( -no_match_vars ); 第一。

        3
  •  7
  •   Brad Gilbert    15 年前

    永远记住 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";
    
        4
  •  4
  •   cakeforcerberus    15 年前

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

    我喜欢使用 美元 当循环通过一个数组时,检索参数(如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的人更加困惑代码。但是,迷惑别人是了解语言的乐趣之一!:)

        5
  •  2
  •   Paul Nathan    15 年前

    我用的典型的是 $_, @_, @ARGV, $!, $/ . 其他的我评论很重。

    Brad注意到 $@ 也是一个很常见的变量。(错误值来自 eval() )

        6
  •  0
  •   Marc Bollinger    15 年前

    我说使用它们——如果您使用的是Perl,那么显然您不会选择它来提高新手的可读性。除了临时开发人员以外,任何一个开发人员都有可能打开一个浏览器/引用窗口,在一个窗口中筛选Perlvar手册页的难度都不亚于查找(和分配给!)全局变量或外部变量。例如,我最近遇到了名为capture buffers的新的in-5.10.x:

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

    弄清楚到底发生了什么并不比进入Parlvar/Perlre阅读一点困难。

    我宁愿在未记录的代码中找到一堆古怪的特殊变量,也不愿在未记录的代码中找到一堆古怪的算法。