<p>虽然与赋值问题中的优先级没有直接关系,但值得注意的是:</p>
<pre class="lang-perl prettyprint-override"><code>my $x if 0
</code></pre>
<p>在假条件</em>中称为<em><code>my()</code>,并且
是<a href="https://metacpan.org/pod/release/XSAWYERX/perl-5.30.0/pod/perldelta.pod#my()-in-false-conditional-prohibited" rel="nofollow noreferrer">prohibited as of Perl 5.30.0</a></p>
<p>因此,一般来说,您应该避免执行这种“条件声明”:</p>
<pre class="lang-perl prettyprint-override"><code>my ($foo, $baz) = ($1, $2) if $entry =~ m/^(\w+) bar (\w+)$/
</code></pre>
<p>因为当条件(本例中的regexp匹配)为<em>false</em>时,可能会导致错误</p>
<p>对于特定的情况,最好依赖<a href="https://stackoverflow.com/users/2766176/brian-d-foy">brian d foy</a>的建议,并将结果直接分配给要填充的变量列表。然后可以在布尔上下文中使用赋值结果,如以下示例所示:</p>
<pre class="lang-perl prettyprint-override"><code>if (my ($foo, $baz) = $entry =~ m/^(\w+) bar (\w+)$/) {
# use $foo and $baz for fun and profit...
}
</code></pre>
<p>或者,如果您在线路上循环:</p>
<pre class="lang-perl prettyprint-override"><code>while (defined(my $entry = <$fh>)) {
my ($foo, $baz) = $entry =~ m/^(\w+) bar (\w+)$/
or next; # <-- executed only when the regexp match fails
# use $foo and $baz for fun and profit...
}
</code></pre>