📄 ch07_09.htm
字号:
<HTML><HEAD><TITLE>Recipe 7.8. Modifying a File in Place with Temporary File (Perl Cookbook)</TITLE><METANAME="DC.title"CONTENT="Perl Cookbook"><METANAME="DC.creator"CONTENT="Tom Christiansen & Nathan Torkington"><METANAME="DC.publisher"CONTENT="O'Reilly & Associates, Inc."><METANAME="DC.date"CONTENT="1999-07-02T01:36:32Z"><METANAME="DC.type"CONTENT="Text.Monograph"><METANAME="DC.format"CONTENT="text/html"SCHEME="MIME"><METANAME="DC.source"CONTENT="1-56592-243-3"SCHEME="ISBN"><METANAME="DC.language"CONTENT="en-US"><METANAME="generator"CONTENT="Jade 1.1/O'Reilly DocBook 3.0 to HTML 4.0"><LINKREV="made"HREF="mailto:online-books@oreilly.com"TITLE="Online Books Comments"><LINKREL="up"HREF="ch07_01.htm"TITLE="7. File Access"><LINKREL="prev"HREF="ch07_08.htm"TITLE="7.7. Writing a Filter"><LINKREL="next"HREF="ch07_10.htm"TITLE="7.9. Modifying a File in Place with -i Switch"></HEAD><BODYBGCOLOR="#FFFFFF"><img alt="Book Home" border="0" src="gifs/smbanner.gif" usemap="#banner-map" /><map name="banner-map"><area shape="rect" coords="1,-2,616,66" href="index.htm" alt="Perl Cookbook"><area shape="rect" coords="629,-11,726,25" href="jobjects/fsearch.htm" alt="Search this book" /></map><div class="navbar"><p><TABLEWIDTH="684"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch07_08.htm"TITLE="7.7. Writing a Filter"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 7.7. Writing a Filter"BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><B><FONTFACE="ARIEL,HELVETICA,HELV,SANSERIF"SIZE="-1"><ACLASS="chapter"REL="up"HREF="ch07_01.htm"TITLE="7. File Access"></A></FONT></B></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch07_10.htm"TITLE="7.9. Modifying a File in Place with -i Switch"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 7.9. Modifying a File in Place with -i Switch"BORDER="0"></A></TD></TR></TABLE></DIV><DIVCLASS="sect1"><H2CLASS="sect1"><ACLASS="title"NAME="ch07-42458">7.8. Modifying a File in Place with Temporary File</A></H2><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch07-pgfId-790">Problem<ACLASS="indexterm"NAME="ch07-idx-1000009634-0"></A><ACLASS="indexterm"NAME="ch07-idx-1000009634-1"></A><ACLASS="indexterm"NAME="ch07-idx-1000009634-2"></A><ACLASS="indexterm"NAME="ch07-idx-1000009634-3"></A><ACLASS="indexterm"NAME="ch07-idx-1000009634-4"></A></A></H3><PCLASS="para">You need to update a file in place, and you can use a temporary file.</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch07-pgfId-796">Solution</A></H3><PCLASS="para">Read from the original file, write changes to a temporary file, and then rename the temporary back to the original:</P><PRECLASS="programlisting">open(OLD, "< $old") or die "can't open $old: $!";open(NEW, "> $new") or die "can't open $new: $!";while (<OLD>) { # change $_, then... print NEW $_ or die "can't write $new: $!";}close(OLD) or die "can't close $old: $!";close(NEW) or die "can't close $new: $!";rename($old, "$old.orig") or die "can't rename $old to $old.orig: $!";rename($new, $old) or die "can't rename $new to $old: $!";</PRE><PCLASS="para">This is the best way to update a file "in place."</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch07-pgfId-1000010064">Discussion</A></H3><PCLASS="para">This technique uses little memory compared to the approach that doesn't use a temporary file. It has the added advantages of giving you a backup file and being easier and safer to program.</P><PCLASS="para">You can make the same changes to the file using this technique that you can with the version that uses no temporary file. For instance, to insert lines at line 20:</P><PRECLASS="programlisting">while (<OLD>) { if ($. == 20) { print NEW "Extra line 1\n"; print NEW "Extra line 2\n"; } print NEW $_;}</PRE><PCLASS="para">Or delete lines 20 through 30:</P><PRECLASS="programlisting">while (<OLD>) { next if 20 .. 30; print NEW $_;}</PRE><PCLASS="para">Note that <CODECLASS="literal">rename</CODE> won't work across filesystems, so you should create your temporary file in the same directory as the file being modified.<ACLASS="indexterm"NAME="ch07-idx-1000009636-0"></A><ACLASS="indexterm"NAME="ch07-idx-1000009636-1"></A></P><PCLASS="para">The truly paranoid programmer would lock the file during the update.</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch07-pgfId-858">See Also</A></H3><PCLASS="para"><ACLASS="xref"HREF="ch07_02.htm"TITLE="Opening a File">Recipe 7.1</A>; <ACLASS="xref"HREF="ch07_10.htm"TITLE="Modifying a File in Place with -i Switch">Recipe 7.9</A>; <ACLASS="xref"HREF="ch07_11.htm"TITLE="Modifying a File in Place Without a Temporary File">Recipe 7.10</A></P></DIV></DIV><DIVCLASS="htmlnav"><P></P><HRALIGN="LEFT"WIDTH="684"TITLE="footer"><TABLEWIDTH="684"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch07_08.htm"TITLE="7.7. Writing a Filter"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 7.7. Writing a Filter"BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><ACLASS="book"HREF="index.htm"TITLE="Perl Cookbook"><IMGSRC="../gifs/txthome.gif"ALT="Perl Cookbook"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch07_10.htm"TITLE="7.9. Modifying a File in Place with -i Switch"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 7.9. Modifying a File in Place with -i Switch"BORDER="0"></A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228">7.7. Writing a Filter</TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><ACLASS="index"HREF="index/index.htm"TITLE="Book Index"><IMGSRC="../gifs/index.gif"ALT="Book Index"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228">7.9. Modifying a File in Place with -i Switch</TD></TR></TABLE><HRALIGN="LEFT"WIDTH="684"TITLE="footer"><FONTSIZE="-1"></DIV<!-- LIBRARY NAV BAR --> <img src="../gifs/smnavbar.gif" usemap="#library-map" border="0" alt="Library Navigation Links"><p> <a href="copyrght.htm">Copyright © 2002</a> O'Reilly & Associates. All rights reserved.</font> </p> <map name="library-map"> <area shape="rect" coords="1,0,85,94" href="../index.htm"><area shape="rect" coords="86,1,178,103" href="../lwp/index.htm"><area shape="rect" coords="180,0,265,103" href="../lperl/index.htm"><area shape="rect" coords="267,0,353,105" href="../perlnut/index.htm"><area shape="rect" coords="354,1,446,115" href="../prog/index.htm"><area shape="rect" coords="448,0,526,132" href="../tk/index.htm"><area shape="rect" coords="528,1,615,119" href="../cookbook/index.htm"><area shape="rect" coords="617,0,690,135" href="../pxml/index.htm"></map> </BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -