home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 May / Chip_2000-05_cd1.bin / zkuste / Perl / ActivePerl-5.6.0.613.msi / 䆊䌷䈹䈙䏵-䞅䞆䞀㡆䞃䄦䠥 / _c210748a3a6c343ab5c0caea9ae070b7 < prev    next >
Text File  |  2000-03-22  |  17KB  |  311 lines

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <HTML>
  3.  
  4. <HEAD>
  5. <TITLE>ActivePerl faq8 - General programming</TITLE>
  6. <LINK rev="made" href="mailto:support@ActiveState.com">
  7. <META name="GENERATOR" charset="iso-8859-1" content="Microsoft FrontPage 4.0">
  8. <META name="ProgId" content="FrontPage.Editor.Document">
  9. <LINK rel="STYLESHEET" href="../../Active.css" type="text/css" media="screen">
  10. </HEAD>
  11.  
  12. <BODY bgcolor="#ffffff">
  13.  
  14. <TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
  15.   <TR>
  16.     <TD class="block" valign="MIDDLE" width="100%" bgcolor="#cccccc"><STRONG>
  17.       <P class="block"> ActivePerl FAQ</P>
  18.       </STRONG></TD>
  19.   </TR>
  20. </TABLE>
  21. <UL>
  22.   <LI><A href="#NAME">NAME</A></LI>
  23.   <LI><A href="#DESCRIPTION">DESCRIPTION</A>
  24.     <UL>
  25.       <LI><A href="#How_do_I_change_the_Win32_Regist">How do I change the Win32 Registry?</A></LI>
  26.       <LI><A href="#How_do_I_read_from_write_to_a_na">How do I read from/write to a named pipe?</A></LI>
  27.       <LI><A href="#How_do_I_write_socket_scripts_">How do I write socket scripts?</A></LI>
  28.       <LI><A href="#What_s_all_this_I_hear_about_not">What's all this I hear about not being able to
  29.         use a socket as a</A></LI>
  30.       <LI><A href="#How_do_I_write_a_sockets_server_">How do I write a sockets server in ActivePerl?</A></LI>
  31.       <LI><A href="#How_do_I_send_or_receive_files_b">How do I send or receive files by FTP?</A></LI>
  32.       <LI><A href="#How_do_I_send_or_receive_files_b">How do I send or receive files by HTTP?</A></LI>
  33.       <LI><A href="#How_do_I_manage_user_accounts_wi">How do I manage user accounts with ActivePerl?</A></LI>
  34.       <LI><A href="#How_do_I_read_from_and_write_to_">How do I read from and write to serial ports?</A></LI>
  35.       <LI><A href="#Why_doesn_t_the_d_operator_work">Why doesn't the -d operator work?</A></LI>
  36.       <LI><A href="#Reading_from_and_writing_to_file">Reading from and writing to files mysteriously
  37.         fails. What's wrong?</A></LI>
  38.       <LI><A href="#When_I_try_to_open_a_file_I_get">When I try to open a file, I get a "bad
  39.         argument" error.</A></LI>
  40.       <LI><A href="#Why_do_I_get_an_error_using_Perl">Why do I get an error using Perl's here-doc
  41.         syntax (<<), that</A></LI>
  42.     </UL>
  43.   </LI>
  44.   <LI><A href="#AUTHOR_AND_COPYRIGHT">AUTHOR AND COPYRIGHT</A></LI>
  45. </UL>
  46. <HR>
  47. <H1><A name="NAME">NAME</A></H1>
  48. <P>ActivePerl faq8 - General programming</P>
  49. <HR>
  50. <H1><A name="DESCRIPTION">DESCRIPTION</A></H1>
  51. <P>General programming questions about ActivePerl</P>
  52. <HR>
  53. <H2><A name="How_do_I_change_the_Win32_Regist">How do I change the Win32 Registry?</A></H2>
  54. <P>There are several Win32 Registry functions provided with ActivePerl. Check the win32mod document
  55. provided with ActivePerl.</P>
  56. <P>If you don't understand how the Registry works, remember that a Registry <EM>key</EM> is like a
  57. directory, and a Registry <EM>value</EM> is like a file. There are several <EM>top level keys</EM>,
  58. and these are kind of like drives.</P>
  59. <P>If you really don't fully understand the Registry, it's probably in your best interest not to
  60. mess around with it.</P>
  61. <HR>
  62. <H2><A name="How_do_I_read_from_write_to_a_na">How do I read from/write to a named pipe?</A></H2>
  63. <P>Named pipes are a interprocess communcations mechanism, mainly used with Microsoft operating
  64. systems (like Win32 platforms). A named pipe can be addressed just like a file.</P>
  65. <P>The name of a named pipe is a UNC (Universal Naming Convention) name, and looks like <EM>\\servername\pipe\pipename</EM>.
  66. <CODE>servername</CODE> is the name of the server you're connecting to, or <CODE>.</CODE> for the
  67. current computer. <CODE>pipe</CODE> is a constant, and <CODE>pipename</CODE> is the name of the
  68. pipe, such as sql for Microsoft SQL Server.</P>
  69. <P>You can use <CODE>open(),</CODE> <CODE>close(),</CODE> <CODE>read(),</CODE> and <CODE>print()</CODE>
  70. on a named pipe just like a file. However, you can't use <CODE>sysread()</CODE> or <CODE>syswrite()</CODE>
  71. on one, because they aren't really files.</P>
  72. <P>There's a program called Win32Pipe on the CPAN archive that can be used to create a named pipe.</P>
  73. <P>If you're starting from scratch, and you have a TCP/IP infrastructure, consider using sockets
  74. rather than named pipes for your IPC mechanism.</P>
  75. <HR>
  76. <H2><A name="How_do_I_write_socket_scripts_">How do I write socket scripts?</A></H2>
  77. <P>There are several examples of socket scripts that are distributed with ActivePerl. They're in the
  78. <EM>eg</EM> subdirectory of your perl directory.</P>
  79. <P>See <A href="#How_do_I_write_a_sockets_server_">How do I write a sockets server in Perl for
  80. Win32?</A> for information about sockets servers.</P>
  81. <HR>
  82. <H2><A name="What_s_all_this_I_hear_about_not">What's all this I hear about not being able to use a
  83. socket as a filehandle?</A></H2>
  84. <P>Early versions of Perl for Win32 didn't allow you to read or write to a socket as if it were a
  85. filehandle. The current versions fully support this, and you shouldn't worry about it too much. If
  86. the version that you're using doesn't work well, get the latest build from ActiveState (see <A href="../ActivePerl-faq1.html#Where_is_the_Perl_for_Win32_inte">Where
  87. is the ActivePerl interpreter available?</A>).</P>
  88. <P>You don't have to specify <CODE>USE_SOCKETS_AS_FILEHANDLES</CODE> when building Perl for Win32 to
  89. get sockets to work like filehandles. It doesn't <EM>hurt</EM>, but it's not necessary.</P>
  90. <HR>
  91. <H2><A name="How_do_I_write_a_sockets_server_">How do I write a sockets server in Perl for Win32?</A></H2>
  92. <P>There's an example of a socket server, TCP-SERVER, in the <EM>eg</EM> directory of your perl
  93. directory. In general, information on socket programming for UNIX is applicable to ActivePerl. See
  94. especially the perlipc page of the documentation.</P>
  95. <P>If you need to develop a server that can service multiple clients at once, take a look at the
  96. IO::Select module. This module allows you to write servers that can manage open connections from
  97. multiple clients. Individual requests on a connection are queued up, so if your server can provide
  98. quick responses, this approach may work well for you. Here's an example, adapted from Erik Olson's
  99. Programming with Perl Modules (one of the volumes in O'Reilly's Win32 Perl Resource Kit):</P>
  100. <PRE>
  101.     use IO::Socket;
  102.     use IO::Select;
  103.     
  104.     # Create a socket to listen on.
  105.     #
  106.     my $listener = 
  107.       IO::Socket::INET->new( LocalPort => 8008, Listen => 5, Reuse => 1 );
  108.     
  109.     die "Can't create socket for listening: $!" unless $listener;
  110.     print "Listening for connections on port 8008\n";
  111.     
  112.     my $readable = IO::Select->new;     # Create a new IO::Select object
  113.     $readable->add($listener);          # Add the listener to it
  114.     
  115.     while(1) {
  116.     
  117.         # Get a list of sockets that are ready to talk to us.
  118.         #
  119.         my ($ready) = IO::Select->select($readable, undef, undef, undef);
  120.         foreach my $s (@$ready) {
  121.             
  122.             # Is it a new connection?
  123.             #
  124.             if($s == $listener) {
  125.             
  126.                 # Accept the connection and add it to our readable list.
  127.                 #
  128.                 my $new_sock = $listener->accept;
  129.                 $readable->add($new_sock) if $new_sock;
  130.                 
  131.                 print $new_sock "Welcome!\r\n";
  132.                 
  133.             } else {  # It's an established connection
  134.             
  135.                 my $buf = <$s>;   # Try to read a line
  136.                 
  137.                 # Was there anyone on the other end?
  138.                 #
  139.                 if( defined $buf ) {
  140.                     
  141.                     # If they said goodbye, close the socket. If not,
  142.                     # echo what they said to us.
  143.                     #
  144.                     if ($buf =~ /goodbye/i) {
  145.                         print $s "See you later!\n";
  146.                         $readable->remove($s);
  147.                         $s->close;
  148.                     } else {
  149.                         print $s "You said: $buf\n";
  150.                     }
  151.                     
  152.                 } else { # The client disconnected.
  153.                 
  154.                     $readable->remove($s);
  155.                     $s->close;
  156.                     print STDERR "Client Connection closed\n";
  157.                     
  158.                 }
  159.             }
  160.         }
  161.     }
  162. </PRE>
  163. <P>For more information, see the IO::Socket and IO::Select documentation. It is also possible to
  164. write a multithreaded server using ActivePerl, if threads are enabled in the version of Perl you are
  165. using. However, threading is still somewhat experimental in Perl 5.005, so use this feature with
  166. caution.</P>
  167. <HR>
  168. <H2><A name="How_do_I_send_or_receive_files_b">How do I send or receive files by FTP?</A></H2>
  169. <P>See the Net::FTP module. Net::FTP is part of the libnet bundle, which is available from CPAN, and
  170. can be installed using the Perl Package Manager (PPM).</P>
  171. <P>Aldo Calpini has developed a ActivePerl extension to do FTP and HTTP using the WININET library.
  172. It's in alpha testing and is available on his web page at <A href="http://dada.perl.it/">http://</A><A href="http://dada.perl.it">dada.perl.it/</A></P>
  173. <HR>
  174. <H2><A name="How_do_I_send_or_receive_files_b">How do I send or receive files by HTTP?</A></H2>
  175. <P>The libwww-perl bundle (LWP) is a collection of modules for WWW access in Perl. LWP is available
  176. from CPAN in source form, or you can install it using the Perl Package Manager (PPM). LWP may also
  177. be included with future binary releases of Perl.</P>
  178. <P>Aldo Calpini has developed a ActivePerl extension to do FTP and HTTP using the WININET library.
  179. It's in alpha testing and is available on his web page at <A href="http://dada.perl.it">http://dada.perl.it/</A></P>
  180. <HR>
  181. <H2><A name="How_do_I_manage_user_accounts_wi">How do I manage user accounts with ActivePerl?</A></H2>
  182. <P>There's an extension called Win32::NetAdmin distributed with ActivePerl. It has a pretty
  183. low-level interface, but it is very possible to manage users and groups with this module.</P>
  184. <HR>
  185. <H2><A name="How_do_I_read_from_and_write_to_">How do I read from and write to serial ports?</A></H2>
  186. <P>Serial ports can be opened just like files in ActivePerl. To open <EM>COM1</EM>, just do this:</P>
  187. <PRE>
  188.     open( PORT, "+>COM1" ) or die "Can't open COM1: $!";
  189. </PRE>
  190. <P>You should be able to read from and write to the file handle using the standard I/O functions
  191. (read() and <CODE>print()),</CODE> but not the system functions (sysread() and <CODE>syswrite()).</CODE></P>
  192. <P>It has been noted (but not tested) that modems that use the Hayes command set require a carriage
  193. return (\r) rather than a line feed (\n) at the end of the command.</P>
  194. <HR>
  195. <H2><A name="Why_doesn_t_the_d_operator_work">Why doesn't the -d operator work?</A></H2>
  196. <P>It does, in fact, work. However, people tend to use it incorrectly and get bad results. To check
  197. for all the subdirectories in a directory, try code like this:</P>
  198. <PRE>
  199.     $path = shift;
  200.     $path = "." unless $path;
  201.     
  202.     opendir( DIR, $path )
  203.         or die "Can't open $path: $!";
  204.     
  205.     while ( $entry = readdir( DIR ) ) {
  206.         $type = ( -d "$path\\$entry" ) ? "dir" : "file"; # $path is crucial!
  207.         print "$type\t$entry\n";
  208.     }
  209.     
  210.     closedir( DIR );
  211. </PRE>
  212. <P>It's a common mistake to leave out the <CODE>$path</CODE> from the <CODE>-d</CODE> check. If you
  213. do this, perl thinks you're talking about files in the current directory. Since the dirs don't <CODE>-e</CODE>
  214. in your current directory, they definitely don't <CODE>-d</CODE>. Exceptions are <EM>.</EM> and <EM>..</EM>,
  215. which exist in every directory.</P>
  216. <HR>
  217. <H2><A name="Reading_from_and_writing_to_file">Reading from and writing to files mysteriously fails.
  218. What's wrong?</A></H2>
  219. <P>On Win32 platforms, there's a big difference between text files and binary files. For text files,
  220. the \r\n characters are translated into \n when read from disk, and the ^Z character is read as an
  221. end-of-file marker. For binary files, no such translation is used.</P>
  222. <P>Although this works great for text files, it really messes things up when you're trying to read
  223. and write binary files. If the read or write does not abort prematurely because a ^Z was found in
  224. the file, you will almost definitely get incorrect bytes in the file due to \n -> \r\n
  225. translation.</P>
  226. <P>The problem is that ActivePerl, and the C runtime library it uses, open file in text mode by
  227. default. For each file handle you use in Perl for binary data, you need to specify that the file
  228. handle is in binary mode. Fortunately, there's a function, binmode, that does just that. See the
  229. perlfunc documentation file for details.</P>
  230. <P>This script copies one binary file to another. Note its use of binmode to set the mode of the
  231. file handle.</P>
  232. <PRE>
  233.     open( INFILE, "<$infile" );
  234.     open( OUTFILE, ">$outfile" );
  235.     
  236.     binmode( INFILE ); binmode( OUTFILE ); # crucial for binary files!
  237.     
  238.     while ( read( INFILE, $buffer, 1024 ) ) {
  239.         print OUTFILE $buffer;
  240.     }
  241.     
  242.     close( INFILE ); 
  243.     close( OUTFILE );
  244. </PRE>
  245. <HR>
  246. <H2><A name="When_I_try_to_open_a_file_I_get">When I try to open a file, I get a "bad
  247. argument" error.</A></H2>
  248. <P>Win32 platforms use the '\' character as a delimiter for paths in a file name (C:\like\this).
  249. However, Perl uses the '\' character as an escape code, to symbolize a special character like the
  250. line feed character (\n) or the tab character (\t).</P>
  251. <P>So, if you try and open a file like this:</P>
  252. <PRE>
  253.     open( MYFILE, "C:\temp\newfile.txt" );
  254. </PRE>
  255. <P>you'll get an error. One solution is to replace each '\' with a double-'\', to show that you
  256. really mean to use that character, not an escape:</P>
  257. <PRE>
  258.    open( MYFILE, "C:\\temp\\newfile.txt" );
  259. </PRE>
  260. <P>Another solution is to use non-interpolating single quote strings, which lets Perl know not to
  261. use any special characters:</P>
  262. <PRE>
  263.    open( MYFILE, 'C:\temp\newfile.txt' );
  264. </PRE>
  265. <P>Finally, you can also use the / character to separate directory components in pathnames. You must
  266. avoid using this in calls to external programs, because some programs tend to treat / as the
  267. option-prefix instead of directory separator. However, ActivePerl (and in fact, all of the Win32
  268. API) understands that / is a directory separator, so using / allows you to more easily port scripts
  269. between UNIX and Win32:</P>
  270. <PRE>
  271.    open( MYFILE, '/temp/newfile.txt' );
  272. </PRE>
  273. <P>See the perlop documentation page for more information on the differences between single quotes
  274. (') and double quotes (``).</P>
  275. <HR>
  276. <H2><A name="Why_do_I_get_an_error_using_Perl">Why do I get an error using Perl's here-doc syntax
  277. (<<), that says "Can't find string terminator anywhere before EOF"?</A></H2>
  278. <P>This is a weird error that occurs when your string terminator is on the last line of your script.
  279. With a script like:</P>
  280. <PRE>
  281.     print <<"END";
  282.     The snake is old, and his skin is cold.
  283.     END
  284. </PRE>
  285. <P>perl is looking for the word END on a line by itself, followed by a line-feed character (\n). If
  286. the END is the last line of your script, you have to remember to hit <Enter> after the word
  287. END, so that Perl can recognize it as the string terminator.</P>
  288. <P>Most UNIX text editors will do this automatically. Most Windows text editors won't. Thus the
  289. problem.</P>
  290. <P>Note that this can also cause a problem with Perl formats, since these are terminated with a
  291. single . on a line by itself. However, it's much more rare, since programmers often specify the
  292. format for output at the top rather than at the bottom of a file.</P>
  293. <HR>
  294. <H1><A name="AUTHOR_AND_COPYRIGHT">AUTHOR AND COPYRIGHT</A></H1>
  295. <P>This FAQ was originally assembled and maintained by Evangelo Prodromou. It has been revised and
  296. updated by Brian Jepson of O'Reilly & Associates, David Grove, David Dmytryshyn and David Sparks
  297. of ActiveState.</P>
  298. <P>This FAQ is in the public domain. If you use it, however, please ensure that you give credit to
  299. the original authors.</P>
  300. <TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
  301.   <TR>
  302.     <TD class="block" valign="MIDDLE" width="100%" bgcolor="#cccccc"><STRONG>
  303.       <P class="block"> ActivePerl FAQ</P>
  304.       </STRONG></TD>
  305.   </TR>
  306. </TABLE>
  307.  
  308. </BODY>
  309.  
  310. </HTML>
  311.