ch07_11.htm
来自「By Tom Christiansen and Nathan Torkingto」· HTM 代码 · 共 343 行
HTM
343 行
<HTML><HEAD><TITLE>Recipe 7.10. Modifying a File in Place Without a 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:34Z"><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_10.htm"TITLE="7.9. Modifying a File in Place with -i Switch"><LINKREL="next"HREF="ch07_12.htm"TITLE="7.11. Locking a File"></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_10.htm"TITLE="7.9. Modifying a File in Place with -i Switch"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 7.9. Modifying a File in Place with -i Switch"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_12.htm"TITLE="7.11. Locking a File"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 7.11. Locking a File"BORDER="0"></A></TD></TR></TABLE></DIV><DIVCLASS="sect1"><H2CLASS="sect1"><ACLASS="title"NAME="ch07-17476">7.10. Modifying a File in Place Without a Temporary File</A></H2><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch07-pgfId-992">Problem</A></H3><PCLASS="para"><ACLASS="indexterm"NAME="ch07-idx-1000009657-0"></A><ACLASS="indexterm"NAME="ch07-idx-1000009657-1"></A>You need to insert, delete, or change one or more lines in a file, and you don't want to (or can't) use a temporary file.</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch07-pgfId-998">Solution</A></H3><PCLASS="para">Open the file in update mode (<CODECLASS="literal">"+<"</CODE>), read the whole file into an array of lines, change the array, then rewrite the file and truncate it to its current seek pointer.</P><PRECLASS="programlisting">open(FH, "+< FILE") or die "Opening: $!";@ARRAY = <FH>;# change ARRAY hereseek(FH,0,0) or die "Seeking: $!";print FH @ARRAY or die "Printing: $!";truncate(FH,tell(FH)) or die "Truncating: $!";close(FH) or die "Closing: $!";</PRE></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch07-pgfId-1018">Discussion</A></H3><PCLASS="para">As explained in the Introduction, the operating system treats files as unstructured streams of bytes. This makes it impossible to insert, modify, or change bits of the file in place. (Except for the special case of fixed-record-length files, discussed in <ACLASS="xref"HREF="ch08_14.htm"TITLE="Updating a Random-Access File">Recipe 8.13</A>.) You can use a temporary file to hold the changed output, or you can read the entire file into memory, change it, and write it back out again.</P><PCLASS="para">Reading everything into memory works for small files, but it doesn't scale well. Trying it on your 800 MB web server log files will either deplete your virtual memory or thrash your machine's VM system. For small files, though, this works:</P><PRECLASS="programlisting">open(F, "+< $infile") or die "can't read $infile: $!";$out = '';while (<F>) { s/DATE/localtime/eg; $out .= $_;}seek(F, 0, 0) or die "can't seek to start of $infile: $!";print F $out or die "can't print to $infile: $!";truncate(F, tell(F)) or die "can't truncate $infile: $!";close(F) or die "can't close $infile: $!";</PRE><PCLASS="para">For other examples of the things you can do in-place, look at the recipes in <ACLASS="xref"HREF="ch08_01.htm"TITLE="File Contents">Chapter 8</A>.</P><PCLASS="para">This approach is for the truly determined. It's harder to write, takes more memory (potentially a <EMCLASS="emphasis">lot</EM> more), doesn't keep a backup file, and may confuse other processes trying to read from the file you're updating. For most purposes, therefore, we suggest it's probably not worth it.<ACLASS="indexterm"NAME="ch07-idx-1000009659-0"></A><ACLASS="indexterm"NAME="ch07-idx-1000009659-1"></A></P><PCLASS="para">Remember to lock if you're paranoid.</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch07-pgfId-1050">See Also</A></H3><PCLASS="para">The <CODECLASS="literal">seek</CODE>, <CODECLASS="literal">truncate</CODE>, <CODECLASS="literal">open</CODE>, <CODECLASS="literal">sysopen</CODE> functions in <ICLASS="filename">perlfunc </I>(1) and in <ACLASS="olink"HREF="../prog/ch03_01.htm">Chapter 3</A> of <ACLASS="citetitle"HREF="../prog/index.htm"TITLE="Programming Perl"><CITECLASS="citetitle">Programming Perl</CITE></A>; <ACLASS="xref"HREF="ch07_09.htm"TITLE="Modifying a File in Place with Temporary File">Recipe 7.8</A>; <ACLASS="xref"HREF="ch07_10.htm"TITLE="Modifying a File in Place with -i Switch">Recipe 7.9</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_10.htm"TITLE="7.9. Modifying a File in Place with -i Switch"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 7.9. Modifying a File in Place with -i Switch"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_12.htm"TITLE="7.11. Locking a File"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 7.11. Locking a File"BORDER="0"></A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228">7.9. Modifying a File in Place with -i Switch</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.11. Locking a File</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 + =
减小字号Ctrl + -
显示快捷键?