Package: dpkg
Version: 1.19.0.5
Severity: minor

Hi,

There are some examples in Dpkg::Version that (if followed) would
imply that the problem will reject the version number "0" despite it
being valid.

Example:
"""
    boolean evaluation
        When the Dpkg::Version object is used in a boolean evaluation (for 
example in "if ($v)" or "$v || 'default'") it returns its string representation 
if the
        version stored is valid ($v->is_valid()) and undef otherwise.
"""

This gives "surprising" results for version 0, which has a string
value that is considered false.  To improve the correctness of the
examples.  I have come to the following alternative examples:

          -> "if (defined($v) and $v->is_valid())"
          -> "$v // 'default'"

Sadly, the "if"-case is no longer elegant but that is the best I could
come up with that worked if $v is possibly undef and still have it
work.  However, it no longer serves as a good example for "boolean
evaluation" (but neither did the original if you want to support the
version "0").

I have used the below to experiment/find the bug:
"""
use v5.20;
use Dpkg::Version;

my $v = Dpkg::Version->new("0");
my $v_or_fallback = $v || 'default';
my $v_dor_fallback = $v // 'default';

say "$v is valid" if $v->is_valid;

if ($v) {
   say "$v is true";
} else {
  say "$v is false";
}

say "\$v || 'default' = $v_or_fallback";
say "\$v // 'default' = $v_dor_fallback";
"""

Result:

"""
0 is valid
0 is false
$v || 'default' = default
$v // 'default' = 0
"""


Thanks,
~Niels

Reply via email to