in reply to Will a substitution in an if/else control structure default to $_?

if ($table->cell($rownum, 0..2) =~ /\xa0/) {

acts on the result returned from $table->cell($rownum, 0..2). The two subsequent substitutions (only one of which is performed for a particular pass through the code) will act on $_ - which has not been affected by the code shown. It may be that what you really want is something like:

my $cellStr = $table->cell($rownum, 0..2); if ($cellStr =~ /\xa0/) { $cellStr =~ s/\xa0\d+/ /; } else { $cellStr =~ s/\xa0//; }

or you could use the default variable:

$_ = $table->cell($rownum, 0..2); if (/\xa0/) { s/\xa0\d+/ /; } else { s/\xa0//; }

Oh, and if/else is not a loop! It is however a control structure.

Update: having looked at your code just a little longer - What are you trying to do! Are you trying to edit the string returned by the method call, or is there a larger context in which your code actually makes sense and you do want to edit the contents of the default variable (which must be set as a side effect of the call - very nasty!)?


Perl reduces RSI - it saves typing

Replies are listed 'Best First'.
Re^2: Will a substitution in an if/else loop default to $_?
by AnomalousMonk (Archbishop) on Aug 21, 2008 at 04:29 UTC
    if (/\xa0/) { s/\xa0\d+/ /; } else { s/\xa0//; }

    If the match in the condition expression of the if-statement for \xa0 somewhere in the string (whether the regex is bound to the string in $_ or $cellStr) fails, how can any substitution involving that character be made in the false clause of the if-statement?

    If the match succeeds, isn't it also redundant since the \xa0 character also appears in the substitution regex in the true clause of the if-statement?

Re^2: Will a substitution in an if/else loop default to $_?
by Lawliet (Curate) on Aug 21, 2008 at 03:36 UTC

    Wouldn't $cellStr be an array If I am assigning three different columns: 0, 1, and 2?

    I'm so adjective, I verb nouns!

    chomp; # nom nom nom

      If it is an array (reference) then the match will stringify the reference and you will end up trying to match against something of the form 'ARRAY(0x1f7c3e4)'. Probably not what you want. Maybe you need to show us the bigger picture because right now what you seem to be doing is completely bogus.


      Perl reduces RSI - it saves typing