in reply to Altering an array with grep & map

Yes, it is possible to modify an array with grep and map.

You mean prepend, by your code.

You don't neeed to slurp the whole file if you're operating on separate lines anyway.

grep acts as a filter and returns a list containing only things for which BLOCK evaluated true. If I understand what you're trying to do, then (apart from the fact that you aren't calling grep correctly in terms of syntax, because you aren't feeding it the LIST you are supposed to), you are also using it wrong because it will weed out lines that didn't contain "links".

If you just use line mode, and take advantage of the fact that substitutions fail silently, you can just do this:

open my $fh, "<file.htm" or die "open: $!"; while (<$fh>) { s{(href|src)="}{$1="../}g; print; }

Replies are listed 'Best First'.
Re^2: Altering an array with grep & map
by JayBee (Scribe) on Jan 18, 2005 at 23:50 UTC
    Wow, that is beautiful, and very simple. Exact thing I was looking for. I also just learned a new opening method too, along with "line mode"<-(will check this out more)... Thanks gaal.

    Additional question: Since I got other mentions about this, can I use other conditional statements within the "while" loop that would ignore the http:// or even rewite it back if it's changed?

    How does this "fail silently"?

      You're welcome!

      I'm not sure what you want to do with "ignoring the http://". Do you want to filter this substring out of the output? Besically the BLOCK of the while loop is run for each line in the input, and you can do as many things as you like in it. So you can (for example) check if a line contains some specific text and decide not to print it out at all -- just put a

      next if /some indication that this line needs to be stripped/;

      before you print the line. Similarly, you can call s/// several times, so if you just wanted to delete the substring "http://", add s{http://}{}g; right next to your existing substitution.

      By "fail silently" I mean that we are attempting a substitution on all lines of the input, not first checking for a match then operating on only those inputs that match. The s/// operator can look at a line, fail to make a substitution, and not complain about it. In this sense it's silent. Think of s/// as encapsulating both the seach and the replace.