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

📄 ch08_05.htm

📁 By Tom Christiansen and Nathan Torkington ISBN 1-56592-243-3 First Edition, published August 1998
💻 HTM
字号:
<HTML><HEAD><TITLE>Recipe 8.4. Reading a File Backwards by Line or Paragraph (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:38:40Z"><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="ch08_01.htm"TITLE="8. File Contents"><LINKREL="prev"HREF="ch08_04.htm"TITLE="8.3. Processing Every Word in a File"><LINKREL="next"HREF="ch08_06.htm"TITLE="8.5. Trailing a Growing 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="ch08_04.htm"TITLE="8.3. Processing Every Word in a File"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 8.3. Processing Every Word in a File"BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><B><FONTFACE="ARIEL,HELVETICA,HELV,SANSERIF"SIZE="-1"><ACLASS="chapter"REL="up"HREF="ch08_01.htm"TITLE="8. File Contents"></A></FONT></B></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch08_06.htm"TITLE="8.5. Trailing a Growing File"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 8.5. Trailing a Growing File"BORDER="0"></A></TD></TR></TABLE></DIV><DIVCLASS="sect1"><H2CLASS="sect1"><ACLASS="title"NAME="ch08-chap08_reading_1">8.4. Reading a File Backwards by Line or Paragraph</A></H2><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch08-pgfId-424">Problem<ACLASS="indexterm"NAME="ch08-idx-1000004636-0"></A><ACLASS="indexterm"NAME="ch08-idx-1000004636-1"></A><ACLASS="indexterm"NAME="ch08-idx-1000004636-2"></A><ACLASS="indexterm"NAME="ch08-idx-1000004636-3"></A></A></H3><PCLASS="para">You want to process each line or paragraph of a text file in reverse.</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch08-pgfId-430">Solution</A></H3><PCLASS="para">Read all lines into an array, then process that array from the end to the start:</P><PRECLASS="programlisting">@lines = &lt;FILE&gt;;while ($line = pop @lines) {    # do something with $line}</PRE><PCLASS="para">Or store an array of lines in reverse order:</P><PRECLASS="programlisting">@lines = reverse &lt;FILE&gt;;foreach $line (@lines) {    # do something with $line}</PRE></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch08-pgfId-454">Discussion</A></H3><PCLASS="para">The limitations of file access mentioned in this chapter's Introduction prevent you from reading a line at a time starting from the end. You must read the lines into memory, then process them in reverse order. Needless to say, this requires at least as much available memory as the size of the file.</P><PCLASS="para">The first technique moves through the array of lines, in reverse order. This <EMCLASS="emphasis">destructively</EM> processes the array, popping an element off the end of the array each time through the loop. We could do it non-destructively with:</P><PRECLASS="programlisting">for ($i = $#lines; $i != -1; $i--) {    $line = $lines[$i];}</PRE><PCLASS="para">The second approach generates an array of lines that is already in reverse order. This array can then be processed non-destructively. We get the reversed lines because the assignment to <CODECLASS="literal">@lines</CODE> forces list context on <CODECLASS="literal">reverse</CODE>, which in turn forces it on <CODECLASS="literal">&lt;FILE&gt;</CODE>. <CODECLASS="literal">&lt;&gt;</CODE> in a list context returns a list of all lines in the file.</P><PCLASS="para">These approaches are easily extended to paragraphs just by changing <CODECLASS="literal">$/</CODE>:</P><PRECLASS="programlisting"># this enclosing block keeps local $/ temporary{               local $/ = '';    @paragraphs = reverse &lt;FILE&gt;;}foreach $paragraph (@paragraphs) {    # do something}<ACLASS="indexterm"NAME="ch08-idx-1000004638-0"></A><ACLASS="indexterm"NAME="ch08-idx-1000004638-1"></A><ACLASS="indexterm"NAME="ch08-idx-1000004638-2"></A><ACLASS="indexterm"NAME="ch08-idx-1000004638-3"></A></PRE></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch08-pgfId-1000004303">See Also</A></H3><PCLASS="para">The <CODECLASS="literal">reverse</CODE> function 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>; the <CODECLASS="literal">$/</CODE> entry in <ICLASS="filename">perlvar  </I>(1), and in the "Special Variables" section of <ACLASS="olink"HREF="../prog/ch02_01.htm">Chapter 2</A> of <ACLASS="citetitle"HREF="../prog/index.htm"TITLE="Programming Perl"><CITECLASS="citetitle">Programming Perl</CITE></A>; <ACLASS="xref"HREF="ch04_11.htm"TITLE="Reversing an Array">Recipe 4.10</A>; <ACLASS="xref"HREF="ch01_07.htm"TITLE="Reversing a String by Word or Character">Recipe 1.6</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="ch08_04.htm"TITLE="8.3. Processing Every Word in a File"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 8.3. Processing Every Word in a File"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="ch08_06.htm"TITLE="8.5. Trailing a Growing File"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 8.5. Trailing a Growing File"BORDER="0"></A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228">8.3. Processing Every Word in a File</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">8.5. Trailing a Growing 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 + -