Beefy Boxes and Bandwidth Generously Provided by pair Networks
Come for the quick hacks, stay for the epiphanies.
 
PerlMonks  

Re: end of line anchor in regex

by sh1tn (Priest)
on Dec 09, 2007 at 17:39 UTC ( [id://655973]=note: print w/replies, xml ) Need Help??


in reply to end of line anchor in regex

Less efficient, still possible:
$text = join($1, grep(/[^hello]/, split(/(\n)/, $text)));

perlrequick, perlretut, split, grep, join.


Replies are listed 'Best First'.
Re^2: end of line anchor in regex
by Anonymous Monk on Dec 09, 2007 at 18:34 UTC
    less efficient, less maintainable, with a warning, and with a pitfall: what if a word other than the word to be deleted is composed entirely of letters in the targeted word. e.g.:

    perl -wMstrict -e "my $text = qq(start\nrats\n); $text = join($1, grep(/[^start]/, split(/(\n)/, $text))); print qq(o/p: \n); print qq({$text})" Use of uninitialized value in join or string at -e line 1. o/p: { }

    wouldn't it at least be better to say  grep($_ ne 'start', ... ) (although it still leaves the "Use of uninitialized value ..." problem, which i don't quite understand)?

      ...although it still leaves the "Use of uninitialized value ..." problem, which i don't quite understand.
      my confusion stemmed from my bemusement with an imagined connection between the (\n) expression in the split regex and the $1 capture variable in the join and the idea that $1 must contain a newline at that point.

      then it occurred to me that the intervening grep regex would undefine all the capture variables and, since it had no capturing parentheses of its own, leave them that way.

      but it goes beyond that.   apparently, "capturing" parentheses in a split regex don't actually capture (at least not to the capture variables), so $1 was never defined at any point.

      perl -wMstrict -e "my @ra = split /(c)/, 'abcde'; print '$1 ', defined $1 ? 'defined' : 'undefined', qq( @ra)" $1 undefined ab c de
Re^2: end of line anchor in regex
by ikegami (Patriarch) on Dec 10, 2007 at 04:37 UTC

    Captures in the split regex does have an effect, but setting $1 shouldn't be relied on. The effect of captures in the split regex is to return the captured data.

    split(/\n/, "hello\nworld") -> ("hello", "world") split(/(\n)/, "hello\nworld") -> ("hello", "\n", "world")

    I'd recommend

    $text = join '', grep $_ ne "$word\n", split /(?<=\n)/, $text;

    if you wanted to use split.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://655973]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others sharing their wisdom with the Monastery: (4)
As of 2024-03-19 11:46 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found