Adriano Allora wrote:
>
> hi to all,
>
> another silly question about a pattern matching which should work but it
> doesn't.
>
> I have a list af string similar to this one:
>
> parola|n.c.,0,fem,sg,0|parola
>
> and I need to select all the chars before the pipe and put them in a
> variable.
>
> That substitution does'n work:
>
> #!/usr/bin/perl -w
> use strict;
> my(%gen, %act, %record, $tex, $char, @parola, $zut);
> while(<>)
> {
> $tex =~ s/^([^|]+).*/$1/o;
> print STDOUT "$i errore sulla linea: $_\n" if !$tex;
> }
>
> The error message is (for example):
>
> Use of uninitialized value in substitution (s///) at
> ./contalettere.pl line 6, <> line 10.
>
> I suppose the rror is in the expression: [^|].
>
> Someone can help me?
Hi Adriano.
Your regex is correct, but it doesn't do what you said you wanted! You're
substituting the entire string in $tex for just those characters up to the first
pipe, but there's nothing in $tex - the data has been read into $_.
If you want to do what you've written, then s/|.*// is a lot easier: it just
removes everything starting at the first pipe.
If you want to do what you said, and put everything up to the pipe into a
variable (scalar $tex?) then
/([^|]+)/;
$tex = $1;
will do it for you. (It captures 'parola' in the example string. is that right?)
And, by the way, you haven't declared the $i in the print() call.
And, by the way again, there's no point in putting the /o modifier on the
substitute as the regex contains no variables and so will be compiled only once
anyway.
HTH,
Rob
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>