⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch07_11.htm

📁 By Tom Christiansen and Nathan Torkington ISBN 1-56592-243-3 First Edition, published August 1998
💻 HTM
字号:
<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 &amp; Nathan Torkington"><METANAME="DC.publisher"CONTENT="O'Reilly &amp; 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">&quot;+&lt;&quot;</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, &quot;+&lt; FILE&quot;)                 or die &quot;Opening: $!&quot;;@ARRAY = &lt;FH&gt;;# change ARRAY hereseek(FH,0,0)                        or die &quot;Seeking: $!&quot;;print FH @ARRAY                     or die &quot;Printing: $!&quot;;truncate(FH,tell(FH))               or die &quot;Truncating: $!&quot;;close(FH)                           or die &quot;Closing: $!&quot;;</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, &quot;+&lt; $infile&quot;)       or die &quot;can't read $infile: $!&quot;;$out = '';while (&lt;F&gt;) {    s/DATE/localtime/eg;    $out .= $_;}seek(F, 0, 0)               or die &quot;can't seek to start of $infile: $!&quot;;print F $out                or die &quot;can't print to $infile: $!&quot;;truncate(F, tell(F))        or die &quot;can't truncate $infile: $!&quot;;close(F)                    or die &quot;can't close $infile: $!&quot;;</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 &copy; 2002</a> O'Reilly &amp; 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 + -