Ling F. Zhang wrote: > I have the following problem: > > I just read in a file <FILE>... > in ONE of line of the file, there is a word I need to > substitute... > but I realize that: > $a = <FILE> would assign $a the first line of the file > @a = <FILE> world assign each line of the file as an > element of @a... > now...s/search/replace/ only works for string... > is there a way to avoid looping through the file (or > elements of @a to do this search/replace?) > now the way I am doing is: > > foreach $m (@a){ > $m =~ s/search/replace/; > } > > is there way to avoid this loop? (such as reading the > whole file into a single scalar?)
Hi Ling. Yes, there is, but I don't understand why you want to avoid the loop. The processing will be the same whether you expand it in-line (by processing one Very Big Record instead of many bite-size ones) or hide it syntactically (behind something like 'map'). It also depends on what you want to do with the data once you've modified it. As you say, my @a = <FILE> reads the entire file as records into an array, but this is more than likely unnecessary and should be attempted only if you can guarantee that your file is a reasonable size compared with your available memory. (For production code you should check the file's size before you read it.) There is a simple way to read the file into a single scalar, but you probably don't need it. It looks like you probably want to edit an existing file and write a modified version, in which case you need something like open OUT, "> newfile" or die $!; while (defined (my $m = <FILE>)) { $m =~ s/search/replace/; print OUT $m; } close OUT; which processes the file one record at a time with negliglible speed penalty. It can be written more idiomatically and succinctly using the $_ variable instead of your own $m open OUT, "> newfile" or die $!; while (<FILE>) { s/search/replace/; print OUT; } close OUT; I hope this helps. if this isn't what you want, come back and we'll try again. Oh, and use strict; # always use warnings; # usually :) Rob -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]