Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling

Re: end of line anchor in regex

by sh1tn (Priest)
on Dec 09, 2007 at 17:39 UTC ( #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 (Pope) 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?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://655973]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (8)
As of 2018-06-21 11:29 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (118 votes). Check out past polls.