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

📄 ch07_18.htm

📁 By Tom Christiansen and Nathan Torkington ISBN 1-56592-243-3 First Edition, published August 1998
💻 HTM
字号:
<HTML><HEAD><TITLE>Recipe 7.17. Caching Open Output Filehandles (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:37:33Z"><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_17.htm"TITLE="7.16. Storing Filehandles in Variables"><LINKREL="next"HREF="ch07_19.htm"TITLE="7.18. Printing to Many Filehandles Simultaneously"></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_17.htm"TITLE="7.16. Storing Filehandles in Variables"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 7.16. Storing Filehandles in Variables"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_19.htm"TITLE="7.18. Printing to Many Filehandles Simultaneously"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 7.18. Printing to Many Filehandles Simultaneously"BORDER="0"></A></TD></TR></TABLE></DIV><DIVCLASS="sect1"><H2CLASS="sect1"><ACLASS="title"NAME="ch07-chap07_caching_0">7.17. Caching Open Output Filehandles</A></H2><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch07-pgfId-1736">Problem<ACLASS="indexterm"NAME="ch07-idx-1000009778-0"></A><ACLASS="indexterm"NAME="ch07-idx-1000009778-1"></A><ACLASS="indexterm"NAME="ch07-idx-1000009778-2"></A><ACLASS="indexterm"NAME="ch07-idx-1000009778-3"></A><ACLASS="indexterm"NAME="ch07-idx-1000009778-4"></A></A></H3><PCLASS="para">You need more output files open simultaneously than your system allows.</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch07-pgfId-1742">Solution</A></H3><PCLASS="para">Use the standard FileCache module:</P><PRECLASS="programlisting">use FileCache;cacheout ($path);         # each time you use a filehandleprint $path &quot;output&quot;;</PRE></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch07-pgfId-1754">Discussion</A></H3><PCLASS="para">FileCache's <CODECLASS="literal">cacheout</CODE><ACLASS="indexterm"NAME="ch07-idx-1000009779-0"></A> function lets you work with more output files than your operating system lets you have open at any one time. If you use it to open an existing file that FileCache is seeing for the first time, the file is truncated to length zero, no questions asked. However, in its opening and closing of files in the background, <CODECLASS="literal">cacheout</CODE> tracks the files it has opened before and does not overwrite them, but appends to them instead. This does not create directories for you, so if you give it <EMCLASS="emphasis">/usr/local/dates/merino.ewe</EM> to open but the directory <EMCLASS="emphasis">/usr/local/dates</EM> doesn't exist, <CODECLASS="literal">cacheout</CODE> will <CODECLASS="literal">die</CODE>.</P><PCLASS="para">The <CODECLASS="literal">cacheout()</CODE> function checks the value of the C-level constant <ACLASS="indexterm"NAME="ch07-idx-1000009785-0"></A>NOFILE from the standard system include file <CODECLASS="literal">sys/param.h</CODE> to determine how many concurrently open files are allowed on your system. This value can be incorrect on some systems and even missing on a few (for instance, on those where the maximum number of open file descriptors is a process resource limit that can be set with the <EMCLASS="emphasis">limit</EM> or <EMCLASS="emphasis">ulimit</EM> commands). If <CODECLASS="literal">cacheout()</CODE> can't get a value for NOFILE, just set <CODECLASS="literal">$FileCache::maxopen</CODE> to be four less than the correct value, or choose a reasonable number by trial and error.</P><PCLASS="para"><ACLASS="xref"HREF="ch07_18.htm#ch07-10438"TITLE="splitwulog">Example 7.8</A> splits an <EMCLASS="emphasis">xferlog</EM> file created by the popular <EMCLASS="emphasis">wuftpd</EM> FTP server into files named after the authenticated user. The fields in <CODECLASS="literal">xferlog</CODE> files are space-separated, and the fourth from last field is the authenticated username.</P><DIVCLASS="example"><H4CLASS="example"><ACLASS="title"NAME="ch07-10438">Example 7.8: splitwulog</A></H4><PRECLASS="programlisting">#!/usr/bin/perl# splitwulog - split wuftpd log by authenticated useruse FileCache;$outdir = '/var/log/ftp/by-user';while (&lt;&gt;) {    unless (defined ($user = (split)[-4])) {       warn &quot;Invalid line: $.\n&quot;;       next;    }    $path = &quot;$outdir/$user&quot;;    cacheout $path;    print $path $_;<ACLASS="indexterm"NAME="ch07-idx-1000011865-0"></A><ACLASS="indexterm"NAME="ch07-idx-1000011865-1"></A><ACLASS="indexterm"NAME="ch07-idx-1000011865-2"></A><ACLASS="indexterm"NAME="ch07-idx-1000011865-3"></A><ACLASS="indexterm"NAME="ch07-idx-1000011865-4"></A>}</PRE></DIV></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch07-pgfId-1786">See Also</A></H3><PCLASS="para">Documentation for the standard FileCache module (also in <ACLASS="olink"HREF="../prog/ch07_01.htm">Chapter 7</A> of <ACLASS="citetitle"HREF="../prog/index.htm"TITLE="Programming Perl"><CITECLASS="citetitle">Programming Perl</CITE></A>); the <CODECLASS="literal">open</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></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_17.htm"TITLE="7.16. Storing Filehandles in Variables"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 7.16. Storing Filehandles in Variables"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_19.htm"TITLE="7.18. Printing to Many Filehandles Simultaneously"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 7.18. Printing to Many Filehandles Simultaneously"BORDER="0"></A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228">7.16. Storing Filehandles in Variables</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.18. Printing to Many Filehandles Simultaneously</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 + -