Hi John

Here's your code again, laid out a little more visibly:


use strict;
use warnings;

my @a;

@a = qw/frc.apmt frc_ff.apmt/;
print join(q{,}, map(&subt($_), @a)), "\n\n";

@a = qw/frc.apmt frc_ff.apmt/;
print join(q{,}, map(s/^(.*)\..*/$1/, @a)), "\n\n";

@a = qw/frc.apmt frc_ff.apmt/;
print join(q{,}, map(s/^(.*)\..*/\1/, @a)), "\n\n";

sub subt {
   my ($a) = @_;
   $a =~ s/^(.*)\..*/$1/;
   print "a=$a\n";
   return $a;
}


and the output is:

\1 better written as $1 at E:\Perl\source\x.pl line 13.
a=frc
a=frc_ff
frc,frc_ff

1,1

1,1


In the latter two cases your call to map generates a list consisting of
the
return values of the subtitution operator acting on each list element.
Those
values are the number of substitutions made on the string, so all the
values in
your array are altered in place and your result is a list of 1s as one
substitution was done on each element.

(You will see that adding 'use warnings' caused Perl to chastise you for
using
\1 in the last case instead of the correct $1.)

To write this correctly, use something like


@a = qw/frc.apmt frc_ff.apmt/;
print join(q{,}, map /([^.]*)/, @a), "\n\n";


will do the trick. The return value of the match operator in list
context is the
value of the captured subexpressions, which in this case is all the
non-dot
characters from the beginning of the string. Note that this alternative
doesn't
modify the original array at all.


HTH,

Rob


Thanks you Rob & Paul... jwm

--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to