Subject: | Using 'splice' on configuration lists [PATCH] |
I'm migrating from Perl 5.8 to 5.10 and beyond (finally!) and noticed
that a script I used within cpan doesn't do the same thing as it used
to. Back before CPAN::HandleConfig.pm, the arguments to the "o conf
urllist splice ..." were passed directly to the perl 'splice' function.
I was using this:
Show quoted text
cpan> o conf urllist splice 1
to remove all but the primary (first) url in the list. Imagine my
surprise when this no longer worked with modern perls!
Since it is not documented otherwise, I consider this a bug for it not
to behave just like perl's splice. However, for safety and backward
compatibility, my patch still does not allow "o conf urllist splice" (no
arguments) to clear the entire url list, the same as recent CPAN
versions do not. It only permits clearing the "tail" of the list, as in
the example above, when the "offset" is non-zero.
DLS
Subject: | CPAN_config_splice.patch |
--- perlbrew/perls/perl-5.14.2/lib/5.14.2/CPAN.pm.org 2012-10-05 13:26:27.000000000 -0400
+++ perlbrew/perls/perl-5.14.2/lib/5.14.2/CPAN.pm 2012-10-10 16:06:31.000000000 -0400
@@ -1920,7 +1920,12 @@
appends a list of valued to the list.
Likewise, C<o conf KEY splice LIST> passes the LIST to the corresponding
-splice command.
+splice command. It departs from the perl function only in that an
+C<offset> of zero without an explicit C<length> will set a length of
+zero (i.e., a no-op). Therefore, C<o conf KEY splice 0> will I<not>
+clear the entire list. [Note: Many recent versions of CPAN did not allow
+saying C<o conf KEY splice 1> to remove all but the first item of a list.
+This is now permitted.]
Finally, any other list of arguments is taken as a new list value for
the KEY variable discarding the previous value.
--- perlbrew/perls/perl-5.14.2/lib/5.14.2/CPAN/HandleConfig.pm.org 2012-10-05 13:26:27.000000000 -0400
+++ perlbrew/perls/perl-5.14.2/lib/5.14.2/CPAN/HandleConfig.pm 2012-10-10 15:14:49.000000000 -0400
@@ -168,8 +168,14 @@
$changed = 1;
} elsif ($func eq "splice") {
my $offset = shift @args || 0;
- my $length = shift @args || 0;
- splice @{$CPAN::Config->{$o}}, $offset, $length, @args; # may warn
+ if (@args || $offset == 0) {
+ # if $offset is zero, we force an omitted length to zero
+ # prevents clearing the whole list with no length given (converts to noop)
+ my $length = shift @args || 0;
+ splice @{$CPAN::Config->{$o}}, $offset, $length, @args; # may warn
+ } else {
+ splice @{$CPAN::Config->{$o}}, $offset; # allow clearing all but the first
+ }
$changed = 1;
} elsif ($func) {
$CPAN::Config->{$o} = [$func, @args];