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

📄 ch08_14.htm

📁 By Tom Christiansen and Nathan Torkington ISBN 1-56592-243-3 First Edition, published August 1998
💻 HTM
字号:
<HTML><HEAD><TITLE>Recipe 8.13. Updating a Random-Access 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:38:49Z"><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_13.htm"TITLE="8.12. Using Random-Access I/O"><LINKREL="next"HREF="ch08_15.htm"TITLE="8.14. Reading a String from a Binary 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_13.htm"TITLE="8.12. Using Random-Access I/O"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 8.12. Using Random-Access I/O"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_15.htm"TITLE="8.14. Reading a String from a Binary File"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 8.14. Reading a String from a Binary File"BORDER="0"></A></TD></TR></TABLE></DIV><DIVCLASS="sect1"><H2CLASS="sect1"><ACLASS="title"NAME="ch08-14803">8.13. Updating a Random-Access File</A></H2><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch08-pgfId-1156">Problem</A></H3><PCLASS="para">You want to read in an old record from a binary file, change its values, and write back the record.</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch08-pgfId-1162">Solution</A></H3><PCLASS="para">After <CODECLASS="literal">read</CODE>ing the old record, <CODECLASS="literal">pack</CODE><ACLASS="indexterm"NAME="ch08-idx-1000004687-0"></A> up the updated values, <CODECLASS="literal">seek</CODE> to the previous address, and write it back.</P><PRECLASS="programlisting">use Fcntl;                          # for SEEK_SET and SEEK_CUR$ADDRESS = $RECSIZE * $RECNO;seek(FH, $ADDRESS, SEEK_SET)        or die &quot;Seeking: $!&quot;;read(FH, $BUFFER, $RECSIZE) == $RECSIZE                                    or die &quot;Reading: $!&quot;;@FIELDS = unpack($FORMAT, $BUFFER);# update fields, then$BUFFER = pack($FORMAT, @FIELDS);seek(FH, -$RECSIZE, SEEK_CUR)       or die &quot;Seeking: $!&quot;;print FH $BUFFER;close FH                            or die &quot;Closing: $!&quot;;</PRE></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch08-pgfId-1192">Discussion</A></H3><PCLASS="para">You don't have to use anything fancier than <CODECLASS="literal">print</CODE> in Perl to output a record. Remember that the opposite of <CODECLASS="literal">read</CODE> is not <CODECLASS="literal">write</CODE> but <CODECLASS="literal">print</CODE>, although oddly enough, the opposite of <CODECLASS="literal">sysread</CODE> actually is <CODECLASS="literal">syswrite</CODE>. (<CODECLASS="literal">split</CODE> and <CODECLASS="literal">join</CODE> are opposites, but there's no <CODECLASS="literal">speak</CODE> to match <CODECLASS="literal">listen</CODE>, no <CODECLASS="literal">resurrect</CODE> for <CODECLASS="literal">kill</CODE>, and no <CODECLASS="literal">curse</CODE> for <CODECLASS="literal">bless</CODE>.)</P><PCLASS="para">The example program shown in <ACLASS="xref"HREF="ch08_14.htm#ch08-24725"TITLE="weekearly">Example 8.4</A>, <EMCLASS="emphasis">weekearly</EM><ACLASS="indexterm"NAME="ch08-idx-1000004686-0"></A>, takes one argument: the user whose record you want to backdate by a week. (Of course, in practice, you wouldn't really want to (nor be able to!) mess with the system accounting files.) This program requires write access to the file to be updated, since it opens the file in update mode. After fetching and altering the record, it packs it up again, skips backwards in the file one record, and writes it out.</P><DIVCLASS="example"><H4CLASS="example"><ACLASS="title"NAME="ch08-24725">Example 8.4: weekearly</A></H4><PRECLASS="programlisting">#!/usr/bin/perl# <ACLASS="indexterm"NAME="ch08-idx-1000004828-0"></A>weekearly -- set someone's login date back a weekuse User::pwent;use IO::Seekable;$typedef = 'L A12 A16';         # linux fmt; sunos is &quot;L A8 A16&quot;$sizeof  = length(pack($typedef, ()));$user    = shift(@ARGV) || $ENV{USER} || $ENV{LOGNAME};$address = getpwnam($user)-&gt;uid * $sizeof;open (LASTLOG, &quot;+&lt;/var/log/lastlog&quot;)    or die &quot;can't update /usr/adm/lastlog: $!&quot;;seek(LASTLOG, $address, SEEK_SET)    or die &quot;seek failed: $!&quot;;read(LASTLOG, $buffer, $sizeof) == $sizeof    or die &quot;read failed: $!&quot;;($time, $line, $host) = unpack($typedef, $buffer);$time  -= 24 * 7 * 60 * 60;         # back-date a week$buffer = pack($typedef, $time, $line, $time);seek(LASTLOG, -$sizeof, SEEK_CUR)   # backup one record    or die &quot;seek failed: $!&quot;;print LASTLOG $record;    close(LASTLOG)    or die &quot;close failed: $!&quot;;<ACLASS="indexterm"NAME="ch08-idx-1000004682-0"></A><ACLASS="indexterm"NAME="ch08-idx-1000004682-1"></A><ACLASS="indexterm"NAME="ch08-idx-1000004682-2"></A><ACLASS="indexterm"NAME="ch08-idx-1000004682-3"></A><ACLASS="indexterm"NAME="ch08-idx-1000004682-4"></A></PRE></DIV></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch08-pgfId-1256">See Also</A></H3><PCLASS="para">The <CODECLASS="literal">open</CODE>, <CODECLASS="literal">seek</CODE>, <CODECLASS="literal">read</CODE>, <CODECLASS="literal">pack</CODE>, and <CODECLASS="literal">unpack</CODE> functions in the <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="ch08_13.htm"TITLE="Using Random-Access I/O">Recipe 8.12</A>; <ACLASS="xref"HREF="ch08_15.htm"TITLE="Reading a String from a Binary File">Recipe 8.14</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_13.htm"TITLE="8.12. Using Random-Access I/O"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 8.12. Using Random-Access I/O"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_15.htm"TITLE="8.14. Reading a String from a Binary File"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 8.14. Reading a String from a Binary File"BORDER="0"></A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228">8.12. Using Random-Access I/O</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.14. Reading a String from a Binary 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 + -