2012-03-22 43 views
3

我知道一个关于perl的好处是有很多方法做很多事情,我想知道什么是最好的(最有效的,最realiable,更快)的方式来赋值给一个变量这是假的(0,空字符串,民主基金等),一些我知道的是:什么是最好的方式来分配一个值到变量是“假”在perl

if (! $x) { 
    $x = 1; 
} 
# or $x = 1 if (! $x); 

$x = $x || 1; 

$x = 1 unless $x; 

$x ||= 1; 

是否还有更好的选择吗?

+1

您如何确定给定的方式是否比另一个“更好”? – jwodder 2012-03-22 21:11:50

+0

也许正在更快,或不太可能失败? – DarkAjax 2012-03-22 21:13:31

+4

我没有看到这些方式中的任何一种可能会失败,纯Perl中可能没有更快的速度...... – jwodder 2012-03-22 21:22:14

回答

6
$x ||= $default; 

是简短,清晰,快速和常用的(即可读的)。

-3

您可能还想添加////=运算符(检查是否已定义)。话虽如此,如果这些方法的速度差异对您的程序真的很重要,您可能需要将部分算法移到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进行优化的意见仍然存在站立。

+3

不,他可能不会。 '0 // 1'返回0. – Vladimir 2012-03-22 21:17:07

+0

因为它应该,因为标量0被定义。你想说什么? – 2012-03-22 21:22:45

+2

'0'是错误的,并且OP要求检测错误的东西,所以当初始值为'0'时解决方案应该起作用。 '//'不会,所以它是错误的。这是他的观点。 – ikegami 2012-03-22 21:40:26

相关问题