Perl在void上下文中无用的私有变量

时间:2013-11-19 19:46:51

标签: perl

我查看了How can I resolve this case of "Useless use of a variable in a void context"?,并表示要使用。连接这是我做的,但我仍然是警告。

在/ mysz / bin / heer第79行的void上下文中无用的私有变量。

 43 sub getLog {
 44     opendir(my $dh, $_[0]) || die "can't opendir $_[0]: $!";
 45     my @ooolog = grep {(/^\.oooo_log/)} readdir($dh);
 46     closedir $dh;
 47     return $ooolog[-1];
 48 }

 ...
 79             $ooolog ? ($ooo = $log. "/". &getLog($log)) : $ooo;  <---------
 ...

不太确定如何在void上下文中修复无用的私有变量

任何人都知道如何修复它?


编辑:

78             $ooodata ? ($fl = $fl. "/.ooo_data") : ($fl = $fl. "/.ooo");

如果是? :问题那么为什么不在78处提出警告?

3 个答案:

答案 0 :(得分:7)

考虑$ooolog为假时会发生什么。你最终执行

$ooo;  # Useless

我认为你要去

$ooo = $ooolog ? $log . "/" . &getLog($log) : $ooo;

但这样做更简单

$ooo = $log . "/" . &getLog($log) if $ooolog;

在添加的问题中,您不再收到警告,因为

$ooo;                  # Useless

已替换为

$fl = $fl. "/.ooo";    # Not useless

那就是说,

$ooodata ? ($fl = $fl. "/.ooo_data") : ($fl = $fl. "/.ooo");

更好地写成

$fl .= $ooodata ? "/.ooo_data" : "/.ooo";

如果你在一个条件运算符中有一个赋值,那么你做错了(一些次优和/或难以阅读的东西)。

答案 1 :(得分:3)

你已经在第79行添加了一个表达式,但实际上你并没有对结果做任何事情。因此,它没用。

写出明显意图的更好(也是无用)的方法是:

$ooo = $log. "/". &getLog($log) if $ooolog;

答案 2 :(得分:2)

只需将其写为

即可
if ($ooolog) { $ooo = $log. "/". &getLog($log) }

或者它是表达的一部分吗?

补充说明:

在第二个示例中,您有两个作业:if $ oodata,

$fl = $fl. "/.ooo_data"

$fl = $fl. "/.ooo"

但在第一个例子中,你所拥有的是,如果$ ooolog,

$ooo = $log. "/". &getLog($log)

$ooo

最后$ooo失去了,没有人得到它的价值。它处于无效环境中,在那里写它是没用的。这就是警告的意思。