Thank you very much Andy, Nathan, Shawn for your kind help. I am new to the perl. Why auto-flush is needed here (STDERR autoflushes)?
It will free the memory or something else. Regards, Jitendra On Tue, Jul 9, 2013 at 9:10 PM, Andy Bach <afb...@gmail.com> wrote: > > On Tue, Jul 9, 2013 at 9:37 AM, Nathan Hilterbrand <noset...@cotse.net>wrote: > >> I want to open a file read+write mode and change >> > the >> > some content in same file without creating another file and copy to it. >> > > > You might want to look at the perl "in place mode" [1], so something like > perl -i.bak -pe ' s/BLR/bangalore/g;' myfile.txt > > will modifiy myfile.txt, as in a while loop (via the -p option: > while (<>) { > s/BLR/bangalore/g; > } > > ) and, as there a param to the -i option, leave you with the original text > in a myfile.txt.bak file > > > [1] > perldoc perlrun has > -i[extension] > specifies that files processed by the "<>" construct are to be > edited in-place. It does this by > renaming the input file, opening the output file by the > original name, and selecting that output file > as the default for print() statements. The extension, if > supplied, is used to modify the name of the > old file to make a backup copy, following these rules: > > If no extension is supplied, no backup is made and the current > file is overwritten. > > If the extension doesn’t contain a "*", then it is appended to > the end of the current filename as a > suffix. If the extension does contain one or more "*" > characters, then each "*" is replaced with the > current filename. In Perl terms, you could think of this as: > > ($backup = $extension) =~ s/\*/$file_name/g; > > This allows you to add a prefix to the backup file, instead of > (or in addition to) a suffix: > > $ perl -pi'orig_*' -e 's/bar/baz/' fileA # backup to > 'orig_fileA' > > Or even to place backup copies of the original files into > another directory (provided the directory > already exists): > > $ perl -pi'old/*.orig' -e 's/bar/baz/' fileA # backup to > 'old/fileA.orig' > > These sets of one-liners are equivalent: > > $ perl -pi -e 's/bar/baz/' fileA # overwrite > current file > $ perl -pi'*' -e 's/bar/baz/' fileA # overwrite > current file > > $ perl -pi'.orig' -e 's/bar/baz/' fileA # backup to > 'fileA.orig' > $ perl -pi'*.orig' -e 's/bar/baz/' fileA # backup to > 'fileA.orig' > > From the shell, saying > > $ perl -p -i.orig -e "s/foo/bar/; ... " > > is the same as using the program: > > #!/usr/bin/perl -pi.orig > s/foo/bar/; > > which is equivalent to > > #!/usr/bin/perl > $extension = '.orig'; > LINE: while (<>) { > if ($ARGV ne $oldargv) { > if ($extension !~ /\*/) { > $backup = $ARGV . $extension; > } > else { > ($backup = $extension) =~ s/\*/$ARGV/g; > } > rename($ARGV, $backup); > open(ARGVOUT, ">$ARGV"); > select(ARGVOUT); > $oldargv = $ARGV; > } > s/foo/bar/; > } > continue { > print; # this prints to original filename > } > select(STDOUT); > > except that the -i form doesn’t need to compare $ARGV to > $oldargv to know when the filename has > changed. It does, however, use ARGVOUT for the selected > filehandle. Note that STDOUT is restored as > the default output filehandle after the loop. > > As shown above, Perl creates the backup file whether or not > any output is actually changed. So this is > just a fancy way to copy files: > > $ perl -p -i'/some/file/path/*' -e 1 file1 file2 file3... > or > $ perl -p -i'.orig' -e 1 file1 file2 file3... > You cannot use -i to create directories or to strip extensions from > files. > > Perl does not expand "~" in filenames, which is good, since > some folks use it for their backup files: > > $ perl -pi~ -e 's/foo/bar/' file1 file2 file3... > > Note that because -i renames or deletes the original file > before creating a new file of the same name, > UNIX-style soft and hard links will not be preserved. > > Finally, the -i switch does not impede execution when no files > are given on the command line. In this > case, no backup is made (the original file cannot, of course, > be determined) and processing proceeds > from STDIN to STDOUT as might be expected. > > -- > > a > > Andy Bach, > afb...@gmail.com > 608 658-1890 cell > 608 261-5738 wk >