[Bioperl-l] commandexts and array refs bug - found problem, not sure of best fix

Ben Bimber bimber at wisc.edu
Thu Jun 10 13:43:04 UTC 2010


hello,

a little while ago i posted a bug about commandexts when you pass an
array ref.  when you pass an arrayref of files, instead of a string
with 1 file, you get an error saying 'cannot use string '......' as an
array ref while strict refs in place'.  i believe i understand the
bug, but am not entirely sure the best way to fix it.  here's the
original code from commandexts.pm, starting line 989:

    my @files = @args{@specs};
    # expand arrayrefs
    my $l = $#files;
    for (0..$l) {
	if (ref($files[$_]) eq 'ARRAY') {
	    splice(@files, $_, 1, @{$files[$_]});
	    splice(@switches, $_, 1, ($switches[$_]) x @{$files[$_]});
	}
    }

It throws the error on the second splice().  The reason is b/c
$files[$_] isnt an array ref anymore, b/c we just expanded it in the
line before.  Truthfully, I dont entirely understand why we're
expanding out @switches for each file.  Maybe i'm missing something
obvious, but why would we want these copied?

however, there's couple ways around it:

1. save the value of  @{$files[$_]} by adding: my @tmp =
@{$files[$_]};, then using @tmp on that line
2. put the second splice() before the first
3. if the idea is actually to expand @switches against every file,
then move this outside the for loop

I originally posted that this could be fixed by surrounding the
problem line with 'no strict'/ 'use strict'; however, that really only
worked b/c the command I was using did not actually have any switches.
 I doubt it would work properly if your command had them.

-Ben



More information about the Bioperl-l mailing list