📄 ch07_02.htm
字号:
></TR><TRCLASS="row"VALIGN="TOP"><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">+> <ICLASS="filename">file</I></P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">yes</P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">yes</P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">no</P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">yes</P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">yes</P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">RDWR TRUNC CREAT</P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para"><CODECLASS="literal">"w+"</CODE></P></TD></TR><TRCLASS="row"VALIGN="TOP"><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">+>> <ICLASS="filename">file</I></P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">yes</P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">yes</P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">yes</P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">yes</P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">no</P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">RDWR APPEND CREAT</P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para"><CODECLASS="literal">"a+" </CODE></P></TD></TR></TBODY></TABLE><PCLASS="para">Here's a tip: you almost never want to use +> or +>>. The first clobbers your file before you can read it, and the second one is confusing because your read pointer can be anywhere, but on many systems, the writer always jumps to the end of the file.</P><PCLASS="para">The <CODECLASS="literal">sysopen</CODE> function takes three or four arguments:</P><PRECLASS="programlisting">sysopen(FILEHANDLE, $name, $flags) or die "Can't open $name : $!";sysopen(FILEHANDLE, $name, $flags, $perms) or die "Can't open $name : $!";</PRE><PCLASS="para"><CODECLASS="literal">$name</CODE> is the name of the file, without any < or <CODECLASS="literal">+</CODE> funny business. <CODECLASS="literal">$flags</CODE> is a number, formed by ORing together separate mode values for <CODECLASS="literal">O_CREAT</CODE><ACLASS="indexterm"NAME="ch07-idx-1000009586-0"></A>, <CODECLASS="literal">O_WRONLY</CODE>, <CODECLASS="literal">O_TRUNC</CODE>, etc. The exact availability of <CODECLASS="literal">O_*</CODE> constants depends on your operating system, so consult the online documentation for this (usually <ICLASS="filename">open </I>(2), but not always), or look in <EMCLASS="emphasis">/usr/include/fcntl.h</EM>. Common ones are:</P><TABLECLASS="informaltable"BORDER="1"CELLPADDING="3"><TBODYCLASS="tbody"><TRCLASS="row"VALIGN="TOP"><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para"><CODECLASS="literal">O_RDONLY</CODE></P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">Read only</P></TD></TR><TRCLASS="row"VALIGN="TOP"><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para"><CODECLASS="literal">O_WRONLY</CODE></P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">Write only</P></TD></TR><TRCLASS="row"VALIGN="TOP"><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para"><CODECLASS="literal">O_RDWR</CODE></P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">Read and write</P></TD></TR><TRCLASS="row"VALIGN="TOP"><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para"><CODECLASS="literal">O_CREAT</CODE></P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">Create the file if it doesn't exist</P></TD></TR><TRCLASS="row"VALIGN="TOP"><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para"><CODECLASS="literal">O_EXCL</CODE></P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">Fail if the file already exists</P></TD></TR><TRCLASS="row"VALIGN="TOP"><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para"><CODECLASS="literal">O_APPEND</CODE></P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">Append to the file</P></TD></TR><TRCLASS="row"VALIGN="TOP"><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para"><CODECLASS="literal">O_TRUNC</CODE></P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">Truncate the file</P></TD></TR><TRCLASS="row"VALIGN="TOP"><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para"><CODECLASS="literal">O_NONBLOCK</CODE></P></TD><TDCLASS="entry"ROWSPAN="1"COLSPAN="1"><PCLASS="para">Non-blocking access</P></TD></TR></TBODY></TABLE><PCLASS="para">Less common <CODECLASS="literal">O_*</CODE> flags sometimes available include <CODECLASS="literal">O_SHLOCK</CODE>, <CODECLASS="literal">O_EXLOCK</CODE>, <CODECLASS="literal">O_BINARY</CODE>, <CODECLASS="literal">O_NOCTTY</CODE>, and <CODECLASS="literal">O_SYNC</CODE>. Consult your <ICLASS="filename">open </I>(2) manpage or its local equivalent for details.</P><PCLASS="para">If you omit the <CODECLASS="literal">$perms</CODE> argument to <CODECLASS="literal">sysopen</CODE>, Perl uses the octal value <CODECLASS="literal">0666</CODE>. These permissions values need to be in octal and are modified by your process's current <CODECLASS="literal">umask</CODE>. A <CODECLASS="literal">umask</CODE><ACLASS="indexterm"NAME="ch07-idx-1000009585-0"></A> value is a number representing disabled permissions bits - if your <CODECLASS="literal">umask</CODE> were 027 (group can't write; others can't read, write, or execute), then passing <CODECLASS="literal">sysopen</CODE> 0666 would create a file with mode 0640 (mathematically: <CODECLASS="literal">0666</CODE> <CODECLASS="literal">&~</CODE> <CODECLASS="literal">027</CODE> is 0640).</P><PCLASS="para">If <CODECLASS="literal">umask</CODE> seems confusing, here's some advice: supply a creation mode of 0666 for regular files and one of 0777 for directories and executable files. This gives users a choice: if they want protected files, they can choose process umasks of 022, 027, or even the particularly antisocial mask of 077. Programs should rarely if ever make policy decisions better left to the user. One exception is when writing files that should be kept private: mail files, web browser cookies, <EMCLASS="emphasis">.rhosts</EM> files, and so on. In short, seldom if ever use 0644 as argument to <CODECLASS="literal">sysopen</CODE> because that takes away the user's option to have a more permissive umask.</P><PCLASS="para">Here are examples of <CODECLASS="literal">open</CODE> and <CODECLASS="literal">sysopen</CODE> in action.</P><PCLASS="para">To open file for reading:</P><PRECLASS="programlisting">open(FH, "< $path") or die $!;sysopen(FH, $path, O_RDONLY) or die $!;</PRE><PCLASS="para">To open file for writing, create new file if needed, or else truncate old file:</P><PRECLASS="programlisting">open(FH, "> $path") or die $!;sysopen(FH, $path, O_WRONLY|O_TRUNC|O_CREAT) or die $!;sysopen(FH, $path, O_WRONLY|O_TRUNC|O_CREAT, 0600) or die $!;</PRE><PCLASS="para">To open file for writing, create new file, file must not exist:</P><PRECLASS="programlisting">sysopen(FH, $path, O_WRONLY|O_EXCL|O_CREAT) or die $!;sysopen(FH, $path, O_WRONLY|O_EXCL|O_CREAT, 0600) or die $!;</PRE><PCLASS="para">To open file for appending, create if necessary:</P><PRECLASS="programlisting">open(FH, ">> $path") or die $!;sysopen(FH, $path, O_WRONLY|O_APPEND|O_CREAT) or die $!;sysopen(FH, $path, O_WRONLY|O_APPEND|O_CREAT, 0600) or die $!;</PRE><PCLASS="para">To open file for appending, file must exist:</P><PRECLASS="programlisting">sysopen(FH, $path, O_WRONLY|O_APPEND) or die $!;</PRE><PCLASS="para">To open file for update, file must exist:</P><PRECLASS="programlisting">open(FH, "+< $path") or die $!;sysopen(FH, $path, O_RDWR) or die $!;</PRE><PCLASS="para">To open file for update, create file if necessary:</P><PRECLASS="programlisting">sysopen(FH, $path, O_RDWR|O_CREAT) or die $!;sysopen(FH, $path, O_RDWR|O_CREAT, 0600) or die $!;</PRE><PCLASS="para">To open file for update, file must not exist:</P><PRECLASS="programlisting">sysopen(FH, $path, O_RDWR|O_EXCL|O_CREAT) or die $!;sysopen(FH, $path, O_RDWR|O_EXCL|O_CREAT, 0600) or die $!;<ACLASS="indexterm"NAME="ch07-idx-1000009581-0"></A></PRE><PCLASS="para">We demonstrate using a creation mask of 0600 here only to show how to create a private file. The argument is normally omitted.</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch07-pgfId-372">See Also</A></H3><PCLASS="para">The <CODECLASS="literal">open</CODE>, <CODECLASS="literal">sysopen</CODE>, and <CODECLASS="literal">umask</CODE> functions in <ICLASS="filename">perlfunc </I>(1) and <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 documentation for the standard IO::File and Fcntl modules (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>); your system's <ICLASS="filename">open </I>(2), <ICLASS="filename">fopen </I>(3), and <ICLASS="filename">umask </I>(2) manpages; <ACLASS="xref"HREF="ch07_03.htm"TITLE="Opening Files with Unusual Filenames">Recipe 7.2</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_01.htm"TITLE="7.0. Introduction"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 7.0. Introduction"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_03.htm"TITLE="7.2. Opening Files with Unusual Filenames"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 7.2. Opening Files with Unusual Filenames"BORDER="0"></A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228">7.0. Introduction</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.2. Opening Files with Unusual Filenames</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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -