On Wed, Jun 12, 2002 at 07:01:08PM -0400, Michael G Schwern wrote:
> A recent thread on p5p about the undocumented behavior of sort() in scalar
> context revealed that "return sort" does not DWYM when the subroutine is
> used in scalar context (you get undef, not the number of elements).
>
> A quick scan showed DBI->available_drivers falls into this trap.
>
> $ perl -MDBI -wle 'print join "\n", DBI->available_drivers; printf "I have %d
>drivers installed\n", scalar DBI->available_drivers'
> CSV
> ExampleP
> File
> Proxy
> Use of uninitialized value in printf at -e line 1.
> I have 0 drivers installed
>
> Attached is a work around.
>
>
> PS I can never find where I'm supposed to send these patches. Neither the
> DBI man page nor the README says where patches should go, or even has your
> address. Perhaps this is by design. :)
Not having my address is - but not saying where to send patches isn't!
Patch applied - thanks.
Tim.
> --
> This sig file temporarily out of order.
> --- DBI.pm 2002/06/12 22:38:11 1.1
> +++ DBI.pm 2002/06/12 22:39:22
> @@ -806,7 +806,9 @@
> }
> closedir(DBI::DIR);
> }
> - return sort @drivers;
> +
> + # "return sort @drivers" will not DWIM in scalar context.
> + return wantarray ? sort @drivers : @drivers;
> }
>
> sub data_sources {
> --- t/01basics.t 2002/06/12 22:39:50 1.1
> +++ t/01basics.t 2002/06/12 22:40:35
> @@ -40,6 +40,10 @@
> ok(0, @drivers);
> ok(0, "@drivers" =~ m/ExampleP/i); # ignore case for VMS & Win32
>
> +# Due to a subtle "feature" of sort, this was broken.
> +my $num_drivers = DBI->available_drivers;
> +ok(0, $num_drivers);
> +
> $switch->debug(0);
> ok(0, 1);
> $switch->{DebugDispatch} = 0; # handled by Switch
> @@ -100,5 +104,5 @@
> ok(0, DBI::hash("foo2",1) == -1263462437, DBI::hash("foo2",1));
> }
>
> -BEGIN { $tests = 38 }
> +BEGIN { $tests = 39 }
> exit 0;