我知道一个关于perl的好处是有很多方法做很多事情,我想知道什么是最好的(最有效的,最realiable,更快)的方式来赋值给一个变量这是假的(0,空字符串,民主基金等),一些我知道的是:什么是最好的方式来分配一个值到变量是“假”在perl
if (! $x) {
$x = 1;
}
# or $x = 1 if (! $x);
$x = $x || 1;
$x = 1 unless $x;
$x ||= 1;
是否还有更好的选择吗?
我知道一个关于perl的好处是有很多方法做很多事情,我想知道什么是最好的(最有效的,最realiable,更快)的方式来赋值给一个变量这是假的(0,空字符串,民主基金等),一些我知道的是:什么是最好的方式来分配一个值到变量是“假”在perl
if (! $x) {
$x = 1;
}
# or $x = 1 if (! $x);
$x = $x || 1;
$x = 1 unless $x;
$x ||= 1;
是否还有更好的选择吗?
$x ||= $default;
是简短,清晰,快速和常用的(即可读的)。
您可能还想添加//
和//=
运算符(检查是否已定义)。话虽如此,如果这些方法的速度差异对您的程序真的很重要,您可能需要将部分算法移到perl外部,并从perl调用它(使用perl作为“胶水”)。
由于迂腐的警察在评论中一直在我的屁股上,所以我花时间做了基准测试。不是世界最大的标杆项目,但我仍然跑:
time perl -e 'my $a; for (1..10000000) { $a ||= $_; }; print $a;'
time perl -e 'my $a; for (1..10000000) { $a //= $_; }; print $a;'
在我的系统中,//=
版本是一致的5-10%的速度。因人而异。
假设原始问题中“假”的引号表示“falsy”而非严格错误,并且进一步假设undef在此上下文中是有效的“false”值,则运算符的undef版本为大约5-10 % 更快。
假设问题的作者正在寻找初始化未初始化变量的最快方法,基于我所做的简单基准,//=
可能更快,不过我在这个级别上对perl进行优化的意见仍然存在站立。
您如何确定给定的方式是否比另一个“更好”? – jwodder 2012-03-22 21:11:50
也许正在更快,或不太可能失败? – DarkAjax 2012-03-22 21:13:31
我没有看到这些方式中的任何一种可能会失败,纯Perl中可能没有更快的速度...... – jwodder 2012-03-22 21:22:14