首先,有没有人有一个全面的Perl特殊变量列表?
其次,使用它们是否更容易完成任务?我总是取消$/
一次读取文件,$|
自动刷新缓冲区,但我不确定是否有其他文件。
第三,应该使用Perl特殊变量,或者在编码时更明确。就个人而言,我是使用特殊变量来操纵代码行为方式的粉丝,但我听到其他人认为它只是混淆了事情。
答案 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并阅读一点点更难。
我更倾向于在未记录的代码中找到一堆古怪的特殊变量,而不是在未记录的代码中找到一堆古怪的算法。