-Original Message-
From: perl-win32-users-boun...@listserv.activestate.com [mailto:perl-
win32-users-boun...@listserv.activestate.com] On Behalf Of Greg Aiken
Sent: Thursday, June 07, 2012 4:08 PM
To: Perl-Win32-Users@listserv.activestate.com
Subject: [EXTERNAL] win32 and modifying a file
dear win32 perl users, ive never actually known how to 'modfiy' a file using
perl on win32. up till now, ive always read file1, found the data i intended
to
change, and have always created a new file 2 containing the changes. if i
wanted to 'simulate' changing file1, when done i could rename file2 to file1.
in other words, ive never learned how to modify a file directly.
ive read win32 makes it more difficult to do this than on unix os's.
but in any case, today i wanted to ask the group.
assumming 'file1' exists with the following 3 records in it:
A
B
C
is there a 'simple' code fragment someone could post that would
demonstrate iterating through this file and when record 'B' is encountered,
we want to change 'B' to 'B_modified' - done in a way where we only access
'file1'. maybe this cant be done, but im asking.
yes i do realize there is another approach, upserp contents of 'file1' modify
in
memory, delete 'file1', then recreate it by dumping the in-memory modified
contents. this seems more like a 'hack' than a direct manipulation of the
original file.
anyways, thanks to any who might be willing to enlighten me about this
topic.
greg
Possibly you want the Perl command line options:
-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'
But, when I try the following one-liner attempting to overwrite my file under
Windows7 CMD shell, I get an error:
perl -pi -e s/^B$/B_modified/ file1
Can't do inplace edit without backup.
Note: This was run with ActivePerl v5.12.4 build 1205.
---
Also, when I tried running a similar command under Cygwin's Perl (v5.10.1), it
behaves differently. It apparently defaults to assuming a .bak backup:
perl -pi -e 's/^B$/B_modified/' file1
produces:
file1 -- the new file
file1.bak -- the original file
If I try using the * construct referred to in the perldoc:
perl -pi'*' -e 's/^B$/B_modified/' file1
it pretty much fails quietly as file1 ends up truncated as a zero length file
(and there is no backup file).
---
So, maybe you can just live with this:
perl -pi.bak -e s/^B$/B_modified/ file1
It will first rename file1 to file1.bak, then process the file outputting each
line into the output file, file1. You will end up with two files though.
Note: I did not code any guard to only do this action if the file name was
file1. So you could pass any number of files to it, and it would iterate on
each of them in similar fashion.
PS. Not sure that this is of any help to you as I ended up having two files.
But at least it may illustrate some more power in Perl.
--
Mike Arms
ma...@sandia.gov
___
Perl-Win32-Users mailing list
Perl-Win32-Users@listserv.ActiveState.com
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs