<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://aznot.com/index.php?action=history&amp;feed=atom&amp;title=Perl_Programming</id>
	<title>Perl Programming - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://aznot.com/index.php?action=history&amp;feed=atom&amp;title=Perl_Programming"/>
	<link rel="alternate" type="text/html" href="https://aznot.com/index.php?title=Perl_Programming&amp;action=history"/>
	<updated>2026-05-07T03:46:29Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://aznot.com/index.php?title=Perl_Programming&amp;diff=5175&amp;oldid=prev</id>
		<title>Kenneth: Created page with &quot;== Tutorials ==  === Local ===  Perl - Kenneth  Learning Perl  Perl 4 Tutorial  UTOSC 2008 - Perl Fundamentals  === External ===  [http://perldoc.perl.org/inde...&quot;</title>
		<link rel="alternate" type="text/html" href="https://aznot.com/index.php?title=Perl_Programming&amp;diff=5175&amp;oldid=prev"/>
		<updated>2019-05-14T21:48:10Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;== Tutorials ==  === Local ===  &lt;a href=&quot;/index.php?title=Perl_-_Kenneth&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Perl - Kenneth (page does not exist)&quot;&gt;Perl - Kenneth&lt;/a&gt;  &lt;a href=&quot;/index.php?title=Learning_Perl&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Learning Perl (page does not exist)&quot;&gt;Learning Perl&lt;/a&gt;  &lt;a href=&quot;/index.php?title=Perl_4_Tutorial&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Perl 4 Tutorial (page does not exist)&quot;&gt;Perl 4 Tutorial&lt;/a&gt;  &lt;a href=&quot;/index.php?title=UTOSC_2008_-_Perl_Fundamentals&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;UTOSC 2008 - Perl Fundamentals (page does not exist)&quot;&gt;UTOSC 2008 - Perl Fundamentals&lt;/a&gt;  === External ===  [http://perldoc.perl.org/inde...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Tutorials ==&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
&lt;br /&gt;
[[Perl - Kenneth]]&lt;br /&gt;
&lt;br /&gt;
[[Learning Perl]]&lt;br /&gt;
&lt;br /&gt;
[[Perl 4 Tutorial]]&lt;br /&gt;
&lt;br /&gt;
[[UTOSC 2008 - Perl Fundamentals]]&lt;br /&gt;
&lt;br /&gt;
=== External ===&lt;br /&gt;
&lt;br /&gt;
[http://perldoc.perl.org/index-tutorials.html Tutorials - perldoc.perl.org]&lt;br /&gt;
&lt;br /&gt;
[http://www.perlmonks.org/index.pl?node=Tutorials Perl Monks - Tutorials]&lt;br /&gt;
&lt;br /&gt;
[http://www.cbkihong.com/index.pl?op=perltut Chan Bernard Ki Hong - Perl 5 Tutorial]&lt;br /&gt;
&lt;br /&gt;
[http://www.pageresource.com/cgirec/index2.htm Page Resource - Beginning Perl Tutorials]&lt;br /&gt;
&lt;br /&gt;
[http://www.cgi101.com/book/ CGI Programming 101 - Learn CGI Today]&lt;br /&gt;
&lt;br /&gt;
[http://ebb.org/PickingUpPerl/ Picking Up Perl, Edition 0.12, A Freely Redistributable Perl Tutorial Book]&lt;br /&gt;
:&amp;quot;This site was created as an early distribution center for Picking Up Perl. Picking Up Perl is a freely redistributable tutorial book on Perl.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[http://www.sthomas.net/roberts-perl-tutorial.htm Robert&amp;#039;s Perl Tutorial]&lt;br /&gt;
:&amp;quot;A basic Perl course primarily for use on Win32 platforms. It assumes that the reader knows nothing of programming whatsoever, but needs a solid grounding for further work. After you finish this course you&amp;#039;ll be ready to specialise in CGI, sysadmin or whatever you want to do with Perl. &amp;quot;&lt;br /&gt;
&lt;br /&gt;
[http://www.perl.com/pub/a/2000/10/begperl1.html perl.com: Beginner&amp;#039;s Introduction to Perl]&lt;br /&gt;
:&amp;quot;Welcome to Perl. Perl is the Swiss Army chainsaw of scripting languages: powerful and adaptable. It was first developed by Larry Wall, a linguist working as a systems administrator for NASA in the late 1980s, as a way to make report processing easier. Since then, it has moved into a large number of roles: automating system administration, acting as glue between different computer systems; and, of course, being one of the most popular languages for CGI programming on the Web.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[http://perldoc.perl.org/perlsyn.html perlsyn - perldoc.perl.org]:&lt;br /&gt;
:perlsyn - Perl syntax:&lt;br /&gt;
:&amp;quot;A Perl program consists of a sequence of declarations and statements which run from the top to the bottom. Loops, subroutines and other control structures allow you to jump around within the code.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Periodic Table of the Perl Operators ==&lt;br /&gt;
&lt;br /&gt;
[http://glyphic.s3.amazonaws.com/ozone/mark/periodic/Periodic%20Table%20of%20the%20Operators%20A4%20300dpi.jpg Periodic Table of the Per Operators] (JPEG Image, 3477x2456 pixels)&lt;br /&gt;
&lt;br /&gt;
[[Media:Periodic_Table_of_the_Perl_Operators.jpg| The Periodic table of Perl operator (local copy)]]&lt;br /&gt;
&lt;br /&gt;
Reference Article: [http://lwn.net/Articles/319642/ The Periodic table of Perl operators - LWN.net]:&lt;br /&gt;
:The Periodic table of Perl operators&lt;br /&gt;
:&lt;br /&gt;
:An updated version of the periodic table of the operators for Perl 6 has been posted. It is truly a work of art, to say the least; suitable for framing.&lt;br /&gt;
&lt;br /&gt;
== What does &amp;quot;Perl&amp;quot; stand for ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Perl is sometimes called the &amp;quot;Practical Extraction and Report Language,&amp;quot; although it has also been caled a &amp;quot;Pathologically Eclectic Rubbish Lister,&amp;quot; among other explanations.  It&amp;#039;s actually a backronym, not an acronym, since Larry Wall (Perl&amp;#039;s creator) came up with the name first and the expansion later.  That&amp;#039;s why &amp;quot;Perl&amp;quot; isn&amp;#039;t in all caps.  There&amp;#039;s no point in arguing which expansion is correct: Larry endorses both. (Source: Learning Perl book)&lt;br /&gt;
&lt;br /&gt;
== Perl Administration ==&lt;br /&gt;
&lt;br /&gt;
=== Show Perl Version ===&lt;br /&gt;
&lt;br /&gt;
 $ perl -v&lt;br /&gt;
 This is perl, v5.8.8 built for i386-linux-thread-multi&lt;br /&gt;
&lt;br /&gt;
=== Perl One Liners ===&lt;br /&gt;
&lt;br /&gt;
 perl -e &amp;#039;...CODE...&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
=== Install Modules ===&lt;br /&gt;
&lt;br /&gt;
To install a CPAN module:&lt;br /&gt;
 perl -MCPAN -e &amp;quot;install [MODULE]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
CPAN Shell:&lt;br /&gt;
 perl -MCPAN -e &amp;#039;shell&amp;#039;&lt;br /&gt;
&lt;br /&gt;
perlmodinstall:&lt;br /&gt;
:&amp;quot;If you are uncomfortable with having something take that much control over your software installation, or it otherwise doesn&amp;#039;t work for you, the perlmodinstall documentation covers module installation for UNIX, Windows and Macintosh in more familiar terms. &amp;quot;&lt;br /&gt;
&lt;br /&gt;
windows:&lt;br /&gt;
:&amp;quot;If you&amp;#039;re using ActivePerl on Windows, the PPM (Perl Package Manager) has much of the same functionality as CPAN.pm. &amp;quot;&lt;br /&gt;
&lt;br /&gt;
Source:&lt;br /&gt;
* [http://www.cpan.org/misc/cpan-faq.html#How_install_Perl_modules The CPAN Frequently Asked Questions]&lt;br /&gt;
* [http://perl.about.com/od/packagesmodules/qt/perlcpan.htm Installing Perl modules from CPAN - Learn how to install most Perl modules from CPAN in this tutorial.]&lt;br /&gt;
&lt;br /&gt;
=== Compiling Module ===&lt;br /&gt;
&lt;br /&gt;
 perl Makefile.pl&lt;br /&gt;
 make&lt;br /&gt;
 make test&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
Source: [http://www.thegeekstuff.com/2008/09/how-to-install-perl-modules-manually-and-using-cpan-command/ How To Install Perl Modules Manually and Using CPAN command]&lt;br /&gt;
&lt;br /&gt;
=== CPAN ===&lt;br /&gt;
&lt;br /&gt;
CPAN Shell&lt;br /&gt;
 perl -MCPAN -e shell&lt;br /&gt;
&lt;br /&gt;
Initially will run through configuration.  If you wish to rerun configuration:&lt;br /&gt;
 &amp;gt; o conf init&lt;br /&gt;
&lt;br /&gt;
To install a module:&lt;br /&gt;
 &amp;gt; install [MODULE]&lt;br /&gt;
&lt;br /&gt;
To install from the command line:&lt;br /&gt;
 cpan [MODULE]&lt;br /&gt;
 perl -MCPAN -e &amp;quot;install [MODULE]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See Also [[Perl - CPAN]]&lt;br /&gt;
&lt;br /&gt;
=== perldoc ===&lt;br /&gt;
&lt;br /&gt;
 perldoc [MODULE]&lt;br /&gt;
&lt;br /&gt;
 perldoc -f [FUNCTION]&lt;br /&gt;
&lt;br /&gt;
== Obfuscated Perl ==&lt;br /&gt;
&lt;br /&gt;
An obfuscated program is purposely written in an incomprehensible manner, so that it is very difficult to understand or reverse-engineer. Perl is one of the classic languages for obfuscated code, and in fact there is an obfuscated Perl contest. This little gem of a script is not only obfuscated, it&amp;#039;s arguably a fine piece of ascii artwork. It&amp;#039;s a perfectly legal Perl script, and produces even more pretty camel pictures when you run it. Have a look, if only for a laugh. &lt;br /&gt;
&lt;br /&gt;
[http://www.perlmonks.org/?node=Obfuscated%20Code Perl Monks - Obfuscated code]&lt;br /&gt;
&lt;br /&gt;
[http://www.mindprod.com/jgloss/unmain.html unmaintainable code : Java Glossary]&lt;br /&gt;
:&amp;quot;unmaintainable code - This is my most popular essay. It is amazing how many people don’t realise it is tongue in cheek&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:&amp;quot;To foil the maintenance programmer, you have to understand how he thinks. He has your giant program. He has no time to read it all, much less understand it. He wants to rapidly find the place to make his change, make it and get out and have no unexpected side effects from the change.&lt;br /&gt;
&lt;br /&gt;
:He views your code through a toilet paper tube. He can only see a tiny piece of your program at a time. You want to make sure he can never get at the big picture from doing that. You want to make it as hard as possible for him to find the code he is looking for. But even more important, you want to make it as awkward as possible for him to safely ignore anything.&lt;br /&gt;
&lt;br /&gt;
:Programmers are lulled into complacency by conventions. By every once in a while, by subtly violating convention, you force him to read every line of your code with a magnifying glass.&lt;br /&gt;
&lt;br /&gt;
:You might get the idea that every language feature makes code unmaintainable — not so, only if properly misused. &amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== [http://www.perlmonks.org/?node_id=20312 Writing highly obfuscated code in Perl] ===&lt;br /&gt;
&lt;br /&gt;
* Take advantage of Perl&amp;#039;s end of line character &amp;quot;;&amp;quot;. Use it to dirty up your code. For example, if you want to go for a certain shape you can use &amp;quot;;&amp;quot;&amp;#039;s to spruce it u&lt;br /&gt;
* Always break up your equal signs.&lt;br /&gt;
* Don&amp;#039;t forget that, if you need better &amp;quot;shaping&amp;quot;, always break up your strings with a new line character &amp;quot;\n&amp;quot;; &lt;br /&gt;
* Regular expressions make for messy code, and that is what we are going for. Use them in excess whenever possible. &lt;br /&gt;
* Add comments. Sometimes adding odd comments here and there can help enhance the shaping of your code. An example of this is found in my work : &amp;quot;modern (perl) art&amp;quot; in the Obfuscated Code section of www.perlmonks.org. However,never comment in a way that would clarify your code. &lt;br /&gt;
* Try to name your variables in a simplistic, yet inconherent way. &amp;quot;woodzy&amp;quot; has done a great job of this with his work called &amp;quot;Email sig. Old news. :/&amp;quot; on www.perlmonks.org.&lt;br /&gt;
* Keep working. Practice enough and you WILL get good results. Someday you will even do lettering. You don&amp;#039;t beleive that thats possible? Check out &amp;quot;Yet Another Perl Conference&amp;quot; by Erudil and you will see what I mean.&lt;br /&gt;
* Keep your code as mathematical as possible. Never leave a simple expression alone, ie (4+4), but rather turn it into (((1*3)+1) + ((100*((1*2)+2)) /(10*10))). Doing this will make your code unreadable real soon. &lt;br /&gt;
* Packing and unpacking will cause your code to be just a bit more unreadble. You will find many examples of this in www.perlmonks.org Obfuscated Code board. &lt;br /&gt;
* Be sure to view some of the code found in Obfuscated Code section of www.perlmonks.org, its real helpfull on giving you some ideas on where to get started at making your code more un-readable. Please note that this is by no means a complete tutorial. I really hope that some other &amp;quot;perl obfuscator&amp;quot; will jump in and write a tutorial much better than this. &lt;br /&gt;
* use the trinary operator: (condition)?foo:bar;&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Just_another_Perl_hacker JAPH] ===&lt;br /&gt;
&lt;br /&gt;
Just Another Perl Hacker&lt;br /&gt;
&lt;br /&gt;
Decoding JAPH from a transposed string literal:&lt;br /&gt;
&lt;br /&gt;
 $_=&amp;quot;krJhruaesrltre c a cnP,ohet&amp;quot;;$_.=$1,print$2while s/(..)(.)//;&lt;br /&gt;
&lt;br /&gt;
Printing out JAPH as separate processes:&lt;br /&gt;
&lt;br /&gt;
 for $i (0..4) { if (!fork) {&lt;br /&gt;
       $i == 0 or not { $SIG{INT} = sub { print &amp;quot;J&amp;quot; } } or&lt;br /&gt;
       $i == 1 or not { $SIG{INT} = sub { print &amp;quot;A&amp;quot; } } or&lt;br /&gt;
       $i == 2 or not { $SIG{INT} = sub { print &amp;quot;P&amp;quot; } } or&lt;br /&gt;
       $i == 3 or not { $SIG{INT} = sub { print &amp;quot;H&amp;quot; } } ;&lt;br /&gt;
       sleep $i; last; } } kill INT =&amp;gt; $$;&lt;br /&gt;
&lt;br /&gt;
Appearing as if it does something completely unrelated to printing JAPH:&lt;br /&gt;
&lt;br /&gt;
 $_ = &amp;quot;wftedskaebjgdpjgidbsmnjgc&amp;quot;;&lt;br /&gt;
 tr/a-z/oh, turtleneck Phrase Jar!/; print;&lt;br /&gt;
&lt;br /&gt;
Using only punctuation, no alphanumeric characters (written by Eric Roode; only works on Unix and Unix-like systems):&lt;br /&gt;
&lt;br /&gt;
 `$=`;$_=\%!;($_)=/(.)/;$==++$|;($.,$/,$,,$\,$&amp;quot;,$;,$^,$#,$~,$*,$:,@%)=(&lt;br /&gt;
 $!=~/(.)(.).(.)(.)(.)(.)..(.)(.)(.)..(.)......(.)/,$&amp;quot;),$=++;$.++;$.++;&lt;br /&gt;
 $_++;$_++;($_,$\,$,)=($~.$&amp;quot;.&amp;quot;$;$/$%[$?]$_$\$,$:$%[$?]&amp;quot;,$&amp;quot;&amp;amp;$~,$#,);$,++&lt;br /&gt;
 ;$,++;$^|=$&amp;quot;;`$_$\$,$/$:$;$~$*$%[$?]$.$~$*${#}$%[$?]$;$\$&amp;quot;$^$~$*.&amp;gt;&amp;amp;$=`&lt;br /&gt;
&lt;br /&gt;
subs [http://www.perlmonks.org/?node_id=234065]:&lt;br /&gt;
 print sub { sub { sub { sub { join &amp;#039; &amp;#039;, @_ } -&amp;gt; (@_, &amp;#039;Hacker&amp;#039;) } &lt;br /&gt;
 -&amp;gt; (@_, &amp;#039;Perl&amp;#039;) } -&amp;gt; (@_, &amp;#039;Another&amp;#039;) } -&amp;gt; (&amp;#039;Just&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Nifty Perl Encoded Message ===&lt;br /&gt;
&lt;br /&gt;
This outputs &amp;quot;RTFM&amp;quot;. [http://lists.freebsd.org/pipermail/aic7xxx/2001-May/003499.html]:&lt;br /&gt;
 perl -e &amp;#039;print $i=pack(c5,(41*2),sqrt(7056),(unpack(c,H)-2),oct(115),10);&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Perl Camel ===&lt;br /&gt;
&lt;br /&gt;
[[Perl Camel]] - The Coded Camel - Cool Linux And Unix Perl Art&lt;br /&gt;
&lt;br /&gt;
[[Media:Perl Camel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Kenneth&amp;#039;s encoded message ===&lt;br /&gt;
&lt;br /&gt;
 I know, it&amp;#039;s geeky, but it means more because I spent time encoding it, right?&lt;br /&gt;
 perl -e &amp;#039;for(&amp;quot;077101114114121032067104114105115116109097115010&amp;quot;=~/.../g){print chr}&amp;#039;&lt;br /&gt;
 Merry Christmas&lt;br /&gt;
&lt;br /&gt;
=== Visual Programming in Perl ===&lt;br /&gt;
&lt;br /&gt;
[http://search.cpan.org/~asavige/Acme-EyeDrops-1.55/lib/Acme/EyeDrops.pm Acme::EyeDrops - Visual Programming in Perl]&lt;br /&gt;
&lt;br /&gt;
==== Sierpinski Triangles ====&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/Sierpinski_triangle Sierpinski Triangles]&lt;br /&gt;
&lt;br /&gt;
[http://search.cpan.org/~asavige/Acme-EyeDrops-1.55/lib/Acme/EyeDrops.pm#Sierpinski_Triangles Perl Sierpinski Triangles Generator]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!perl -l&lt;br /&gt;
$x=2**pop;print$&amp;quot;x--$x,map$x&amp;amp;$_?$&amp;quot;x2:&amp;quot;/\\&amp;quot;,0..$y++while$x&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ perl sierpinski_triangles.pl 4&lt;br /&gt;
               /\&lt;br /&gt;
              /\/\&lt;br /&gt;
             /\  /\&lt;br /&gt;
            /\/\/\/\&lt;br /&gt;
           /\      /\&lt;br /&gt;
          /\/\    /\/\&lt;br /&gt;
         /\  /\  /\  /\&lt;br /&gt;
        /\/\/\/\/\/\/\/\&lt;br /&gt;
       /\              /\&lt;br /&gt;
      /\/\            /\/\&lt;br /&gt;
     /\  /\          /\  /\&lt;br /&gt;
    /\/\/\/\        /\/\/\/\&lt;br /&gt;
   /\      /\      /\      /\&lt;br /&gt;
  /\/\    /\/\    /\/\    /\/\&lt;br /&gt;
 /\  /\  /\  /\  /\  /\  /\  /\&lt;br /&gt;
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Perl Code ==&lt;br /&gt;
&lt;br /&gt;
=== Common Pragma ===&lt;br /&gt;
&lt;br /&gt;
Note: For clarity, the following examples contain basic Perl code snippets which do not use my or other recommended practices. For happy Perl programming always use the pragma&lt;br /&gt;
&lt;br /&gt;
 use strict;&lt;br /&gt;
 use warnings;&lt;br /&gt;
&lt;br /&gt;
at the start of your scripts. &lt;br /&gt;
&lt;br /&gt;
Source: [http://sql-info.de/mysql/examples/Perl-DBI-examples.html Perl DBI examples (DBD::mysql)]&lt;br /&gt;
&lt;br /&gt;
=== System Call ===&lt;br /&gt;
&lt;br /&gt;
 @result = `wc -l /etc/passwd`;&lt;br /&gt;
 print &amp;quot;Number of Lines: @result\n&amp;quot;;&lt;br /&gt;
 print &amp;quot;Return value: $?\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 system &amp;quot;cmd&amp;quot;, &amp;quot;arg1&amp;quot;, &amp;quot;arg2&amp;quot;, ...;&lt;br /&gt;
&lt;br /&gt;
 exec &amp;quot;wc -l /etc/passwd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Try/Catch with Eval ===&lt;br /&gt;
&lt;br /&gt;
 eval{&lt;br /&gt;
   ### try block&lt;br /&gt;
 };  # notice the semi colon&lt;br /&gt;
 if ($@){&lt;br /&gt;
   ### catch block&lt;br /&gt;
   print &amp;quot;Error: $@ \n&amp;quot;;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Calling dynamic function ===&lt;br /&gt;
&lt;br /&gt;
 sub hello {&lt;br /&gt;
   print &amp;quot;hello&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 $func = &amp;quot;hello&amp;quot;;&lt;br /&gt;
 &amp;amp;$func;&lt;br /&gt;
&lt;br /&gt;
=== Flushing console buffer ===&lt;br /&gt;
&lt;br /&gt;
 $| = 1;&lt;br /&gt;
&lt;br /&gt;
 $|++;&lt;br /&gt;
&lt;br /&gt;
=== Duping STDOUT ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  print &amp;quot;STDOUT 1&amp;quot;;&lt;br /&gt;
  warn &amp;quot;STDERR 1&amp;quot;;&lt;br /&gt;
  print &amp;quot;STDOUT 2&amp;quot;;&lt;br /&gt;
  warn &amp;quot;STDERR 2&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  # redirect standard output&lt;br /&gt;
  open my $oldout, &amp;quot;&amp;gt;&amp;amp;STDOUT&amp;quot; or die &amp;quot;Can&amp;#039;t duplicate STDOUT: $!&amp;quot;;&lt;br /&gt;
  open my $olderr, &amp;quot;&amp;gt;&amp;amp;STDERR&amp;quot; or die &amp;quot;Can&amp;#039;t duplicate STDERR: $!&amp;quot;;&lt;br /&gt;
  close STDOUT;&lt;br /&gt;
  open STDOUT, &amp;quot;&amp;gt;$log_file&amp;quot; or die &amp;quot;Can&amp;#039;t redirect STDOUT: $!&amp;quot;;&lt;br /&gt;
  close STDERR;&lt;br /&gt;
  open STDERR, &amp;quot;&amp;gt;&amp;gt;&amp;amp;STDOUT&amp;quot; or die &amp;quot;Can&amp;#039;t redirect STDERR: $!&amp;quot;;&lt;br /&gt;
  print &amp;quot;STDOUT 3&amp;quot;;&lt;br /&gt;
  warn &amp;quot;STDERR 3&amp;quot;;&lt;br /&gt;
  print &amp;quot;STDOUT 4&amp;quot;;&lt;br /&gt;
  warn &amp;quot;STDERR 4&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  # restore the original standard output&lt;br /&gt;
  close STDOUT;&lt;br /&gt;
  open STDOUT, &amp;quot;&amp;gt;&amp;amp;$oldout&amp;quot; or die &amp;quot;Can&amp;#039;t restore old STDOUT: $!&amp;quot;;&lt;br /&gt;
  close STDERR;&lt;br /&gt;
  open STDERR, &amp;quot;&amp;gt;&amp;amp;$olderr&amp;quot; or die &amp;quot;Can&amp;#039;t restore old STDERR: $!&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  print &amp;quot;STDOUT 5&amp;quot;;&lt;br /&gt;
  warn &amp;quot;STDERR 5&amp;quot;;&lt;br /&gt;
  print &amp;quot;STDOUT 6&amp;quot;;&lt;br /&gt;
  warn &amp;quot;STDERR 6&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Source: [http://www.tek-tips.com/viewthread.cfm?qid=1055865&amp;amp;page=10 Perl - Perl output redirection]&lt;br /&gt;
&lt;br /&gt;
=== Random Number ===&lt;br /&gt;
&lt;br /&gt;
 # random number&lt;br /&gt;
 my $random_number = rand();&lt;br /&gt;
   0.521563085335405&lt;br /&gt;
&lt;br /&gt;
 # with range&lt;br /&gt;
 my $random_number = rand($range);&lt;br /&gt;
   34.0500569277541&lt;br /&gt;
&lt;br /&gt;
 # integer&lt;br /&gt;
 my $random_number = int(rand($range));&lt;br /&gt;
   68&lt;br /&gt;
&lt;br /&gt;
 # with offset&lt;br /&gt;
 my $random_number = int(rand($range)) + $minimum;&lt;br /&gt;
   129&lt;br /&gt;
&lt;br /&gt;
 # documentation&lt;br /&gt;
 perldoc -f rand&lt;br /&gt;
&lt;br /&gt;
Source: [http://perlmeme.org/howtos/perlfunc/rand_function.html Using the Perl rand() function]&lt;br /&gt;
&lt;br /&gt;
=== Dropping privileges ===&lt;br /&gt;
&lt;br /&gt;
# permanently drops privs&lt;br /&gt;
($&amp;lt;,$&amp;gt;) = (getpwnam(&amp;#039;nobody&amp;#039;),getpwnam(&amp;#039;nobody&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
Source; It&amp;#039;s Not Easy Being Omnipotent (Perl for System Administration)&lt;br /&gt;
&lt;br /&gt;
=== Include Files ===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Perl&amp;#039;s equivalents of &amp;quot;include&amp;quot; are [http://perldoc.perl.org/functions/use.html use], [http://perldoc.perl.org/functions/require.html require] and [http://perldoc.perl.org/functions/do.html do].&amp;quot; [http://www.perlmonks.org/?node_id=533866]&lt;br /&gt;
&lt;br /&gt;
== Perl Quote - Passing Forbidden Arguments ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Perl and I found a void context to pass forbidden arguments. After the shebang it was all standard error from there on. Careful where you put your Lexical.&amp;quot;&lt;br /&gt;
::-- Kenneth Burgener (March 16 at 9:55pm) on Facebook&lt;br /&gt;
&lt;br /&gt;
== Advanced Perl Topics ==&lt;br /&gt;
&lt;br /&gt;
=== Modules ===&lt;br /&gt;
&lt;br /&gt;
==== Module Search Path ====&lt;br /&gt;
&lt;br /&gt;
Modules are search for in the @INC list.  The current directory (&amp;#039;.&amp;#039;) is generally included in this list.&lt;br /&gt;
 @INC = ( @INC, &amp;quot;./lib&amp;quot;);&lt;br /&gt;
 require ABC::Test;&lt;br /&gt;
&lt;br /&gt;
You can easily see what directories are assigned to the @INC  array on your system with this code:&lt;br /&gt;
 perl -e &amp;quot;print join(qq|\n|,@INC).qq|\n|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A module referenced as:&lt;br /&gt;
 use ABC::Test;&lt;br /&gt;
would be found as under:&lt;br /&gt;
 ABC/Test.pm&lt;br /&gt;
&lt;br /&gt;
Can use &amp;quot;Local&amp;quot; to avoid global modules (place all modules under ./Local/):&lt;br /&gt;
 use Local::Test;&lt;br /&gt;
&lt;br /&gt;
Locate modules not in standard locations:&lt;br /&gt;
 use lib qw(/myPerl/myModules/);&lt;br /&gt;
 use SayHello;&lt;br /&gt;
&lt;br /&gt;
Can use &amp;#039;require&amp;#039; to specify any file name to load.  &amp;#039;use&amp;#039; also loads modules at compile, where &amp;#039;require&amp;#039; loads modules at runtime.&lt;br /&gt;
&lt;br /&gt;
The Net::Telnet module is found here on my Cygwin system:&lt;br /&gt;
 /usr/lib/perl5/vendor_perl/5.10/Net/Telnet.pm&lt;br /&gt;
&lt;br /&gt;
==== Extending the library path ====&lt;br /&gt;
&lt;br /&gt;
Option #1: Install the module somewhere in the standard library path&lt;br /&gt;
 # list standard library path&lt;br /&gt;
 perl -le &amp;#039;print foreach @INC&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Option #2: Set the environment variable PERL5LIB&lt;br /&gt;
 PERL5LIB=/home/path/lib:/usr/another/path/lib; export PERL5LIB&lt;br /&gt;
&lt;br /&gt;
Note: Be aware that scripts running with -T option (taint checks) don&amp;#039;t use that variable, so in those cases this option won&amp;#039;t work.&lt;br /&gt;
&lt;br /&gt;
Option #2: Use &amp;#039;-I&amp;#039; command line parameter&lt;br /&gt;
 perl -I /home/path/lib -I /usr/another/lib script.pl&lt;br /&gt;
&lt;br /&gt;
Option #3: Add the library path in your script&lt;br /&gt;
 #!/usr/bin/perl&lt;br /&gt;
 use lib &amp;quot;/home/path/lib&amp;quot;;&lt;br /&gt;
 use lib &amp;quot;/usr/another/lib&amp;quot;;&lt;br /&gt;
 use MyCustomModule;&lt;br /&gt;
&lt;br /&gt;
Note: Notice that this statement prepends &amp;quot;path&amp;quot; to the @INC array, so it&amp;#039;s basically the same as&lt;br /&gt;
 unshift @INC, &amp;quot;path&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Reference: [http://www.perlhowto.com/extending_the_library_path extending the library path | Perl HowTo]&lt;br /&gt;
&lt;br /&gt;
==== Basic Module ====&lt;br /&gt;
&lt;br /&gt;
SayHello [http://www.webreference.com/programming/perl/modules/3.html]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package SayHello;&lt;br /&gt;
&lt;br /&gt;
our $VERSION=0.10;&lt;br /&gt;
# or cleaner code:&lt;br /&gt;
# $SayHello::VERSION = 0.10;&lt;br /&gt;
&lt;br /&gt;
my $hello_string=&amp;quot;Hello World!&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
sub hello_message {&lt;br /&gt;
   return $hello_string;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use SayHello;&lt;br /&gt;
# can check for version or higher:&lt;br /&gt;
# use SayHello 0.20;&lt;br /&gt;
&lt;br /&gt;
# direct access to function&lt;br /&gt;
print SayHello::hello_message() . &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# direct access to variable:&lt;br /&gt;
print $SayHello::VERSION . &amp;quot;\n&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exporting Module ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package SayHello;&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
require Exporter;&lt;br /&gt;
our @ISA = qw(Exporter);&lt;br /&gt;
our @EXPORT_OK = qw(hello_message);&lt;br /&gt;
# export by default:&lt;br /&gt;
# our @EXPORT = qw(hello_message);&lt;br /&gt;
&lt;br /&gt;
our $VERSION=0.10;&lt;br /&gt;
my $hello_string=&amp;quot;Hello World!&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
sub hello_message {&lt;br /&gt;
    return $hello_string;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use SayHello qw(hello_message);&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;You are using version: $SayHello::VERSION of SayHello.\n&amp;quot;;&lt;br /&gt;
print hello_message().&amp;quot;\n&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Complicated Module ====&lt;br /&gt;
&lt;br /&gt;
A module generally starts with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package ABC::Test;&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
require 5.002;&lt;br /&gt;
&lt;br /&gt;
## Module export&lt;br /&gt;
use vars qw(@EXPORT_OK);&lt;br /&gt;
@EXPORT_OK = qw(TEST1 TEST2 TEST_3);&lt;br /&gt;
&lt;br /&gt;
## Module import&lt;br /&gt;
use Exporter ();&lt;br /&gt;
&lt;br /&gt;
## Base classes&lt;br /&gt;
use vars qw(@ISA);&lt;br /&gt;
@ISA = qw(Exporter);&lt;br /&gt;
&lt;br /&gt;
## Global variables&lt;br /&gt;
use vars qw($VERSION @MYOPTS);&lt;br /&gt;
$VERSION = &amp;quot;3.03&amp;quot;;&lt;br /&gt;
@MYOPTS = (&amp;quot;OPT1&amp;quot;, &amp;quot;OPT2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
sub new {&lt;br /&gt;
    my ($class) = @_;&lt;br /&gt;
    my (&lt;br /&gt;
        $errmode,&lt;br /&gt;
        $fh_open,&lt;br /&gt;
        $host,&lt;br /&gt;
        $self,&lt;br /&gt;
        %args,&lt;br /&gt;
        );&lt;br /&gt;
    local $_;&lt;br /&gt;
&lt;br /&gt;
    ## Create a new object with defaults.&lt;br /&gt;
    $self = $class-&amp;gt;SUPER::new;&lt;br /&gt;
    *$self-&amp;gt;{net_telnet} = {&lt;br /&gt;
        bin_mode         =&amp;gt; 0,&lt;br /&gt;
        blksize          =&amp;gt; &amp;amp;_optimal_blksize(),&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    $self-&amp;gt;func1;&lt;br /&gt;
&lt;br /&gt;
    $self;&lt;br /&gt;
} # end sub new&lt;br /&gt;
&lt;br /&gt;
sub DESTROY {&lt;br /&gt;
} # end sub DESTROY&lt;br /&gt;
&lt;br /&gt;
sub func1 {&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## Exported Constants ##&lt;br /&gt;
sub MYCONST1 ()     {255};&lt;br /&gt;
sub MYCONST2 ()     {1};&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
__END__;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## USER DOCUMENTATION ##&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## To format the following documentation into a more readable format,&lt;br /&gt;
## use one of these programs: perldoc; pod2man; pod2html; pod2text.&lt;br /&gt;
## For example, to nicely format this documentation for printing, you&lt;br /&gt;
## may use pod2man and groff to convert to postscript:&lt;br /&gt;
##   pod2man Net/Telnet.pm | groff -man -Tps &amp;gt; Net::Telnet.ps&lt;br /&gt;
&lt;br /&gt;
=head1 NAME&lt;br /&gt;
&lt;br /&gt;
Net::Telnet - interact with TELNET port or other TCP ports&lt;br /&gt;
&lt;br /&gt;
=head1 SYNOPSIS&lt;br /&gt;
&lt;br /&gt;
C&amp;lt;use Net::Telnet ();&amp;gt;&lt;br /&gt;
&lt;br /&gt;
see METHODS section below&lt;br /&gt;
&lt;br /&gt;
=head1 DESCRIPTION&lt;br /&gt;
&lt;br /&gt;
Net::Telnet allows you to make client connections to a TCP port and do&lt;br /&gt;
network I/O, especially to a port using the TELNET protocol.  Simple&lt;br /&gt;
I/O methods such as print, get, and getline are provided.  More&lt;br /&gt;
sophisticated interactive features are provided because connecting to&lt;br /&gt;
a TELNET port ultimately means communicating with a program designed&lt;br /&gt;
for human interaction.  These interactive features include the ability&lt;br /&gt;
to specify a time-out and to wait for patterns to appear in the input&lt;br /&gt;
stream, such as the prompt from a shell.&lt;br /&gt;
&lt;br /&gt;
Other reasons to use this module than strictly with a TELNET port are:&lt;br /&gt;
&lt;br /&gt;
=over 2&lt;br /&gt;
&lt;br /&gt;
=item *&lt;br /&gt;
&lt;br /&gt;
You&amp;#039;re not familiar with sockets and you want a simple way to make&lt;br /&gt;
client connections to TCP services.&lt;br /&gt;
&lt;br /&gt;
=item *&lt;br /&gt;
&lt;br /&gt;
You&amp;#039;re not familiar with sockets and you want a simple way to make&lt;br /&gt;
client connections to TCP services.&lt;br /&gt;
&lt;br /&gt;
=back&lt;br /&gt;
&lt;br /&gt;
=over 4&lt;br /&gt;
&lt;br /&gt;
=item B&amp;lt;cmd&amp;gt; - issue something&lt;br /&gt;
&lt;br /&gt;
   Test&lt;br /&gt;
&lt;br /&gt;
=back&lt;br /&gt;
&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CGI ===&lt;br /&gt;
&lt;br /&gt;
Virtual Host:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName t0e.org&lt;br /&gt;
    ...&lt;br /&gt;
    AddHandler cgi-script .cgi&lt;br /&gt;
    &amp;lt;Directory /&amp;gt;&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
        AllowOverride All&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
helloworld.cgi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
print &amp;quot;Content-type: text/html\n\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
print &amp;lt;&amp;lt;EOF&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hello World&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Environment Variables:&lt;br /&gt;
 $querystring = $ENV{QUERY_STRING}; &lt;br /&gt;
 my @values = split(/&amp;amp;/,$ENV{QUERY_STRING});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table summary=&amp;quot;Table listing some Perl environment variables and what information they contain.&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;75%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th scope=&amp;quot;col&amp;quot;&amp;gt;Name&amp;lt;/th&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;th scope=&amp;quot;col&amp;quot;&amp;gt;What it Gets&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;CONTENT_LENGTH&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Number of characters submitted from a POST command&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;HTTP_REFERER&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;URL user came from, if available.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;HTTP_USER_AGENT&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;td&amp;gt;Type of Browser viewer is using, if available.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;QUERY_STRING&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;String in URL after the ? character&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;REMOTE_ADDR&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Remote user&amp;#039;s IP address&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;REMOTE_HOST&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;td&amp;gt;Name of user&amp;#039;s host, if available.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;SERVER_NAME&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Name of the local server, like: www.yoursite.com&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* [http://www.pageresource.com/cgirec/index2.htm Page Resource - Beginning Perl Tutorials]&lt;br /&gt;
* [http://www.cgi101.com/book/ CGI Programming 101 - Learn CGI Today]&lt;br /&gt;
&lt;br /&gt;
=== Sending Mail ===&lt;br /&gt;
&lt;br /&gt;
 $ENV{PATH} = &amp;quot;/usr/sbin&amp;quot;;&lt;br /&gt;
 open (MAIL, &amp;quot;|/usr/sbin/sendmail -t -oi&amp;quot;) or &lt;br /&gt;
    die &amp;quot;Can&amp;#039;t fork for sendmail: $!\n&amp;quot;;&lt;br /&gt;
 # -t  	      	Read message for recipients. To:, Cc:, and Bcc: lines will be scanned for recipient addresses&lt;br /&gt;
 # -oi 	     	Ignore dots alone on lines by themselves in incoming messages.&lt;br /&gt;
 my $recipient = &amp;#039;recipient@cgi101.com&amp;#039;;&lt;br /&gt;
 print MAIL &amp;quot;From: sender\@cgi101.com\n&amp;quot;;&lt;br /&gt;
 print MAIL &amp;quot;To: $recipient\n&amp;quot;;&lt;br /&gt;
 print MAIL &amp;quot;Subject: Guestbook Form\n&amp;quot;;&lt;br /&gt;
 print MAIL &amp;quot;\n&amp;quot;;&lt;br /&gt;
 close(MAIL);&lt;br /&gt;
&lt;br /&gt;
Reference:&lt;br /&gt;
* [http://www.cgi101.com/book/ch4/text.html CGI Programming 101: Chapter 4: Processing Forms and Sending Mail]&lt;br /&gt;
&lt;br /&gt;
=== Telnet ===&lt;br /&gt;
&lt;br /&gt;
[http://www.perlfect.com/articles/telnet.shtml Using perl to connect to remote hosts via telnet.]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use Net::Telnet;&lt;br /&gt;
$telnet = new Net::Telnet ( Timeout=&amp;gt;10, Errmode=&amp;gt;&amp;#039;die&amp;#039;);&lt;br /&gt;
$telnet-&amp;gt;open(&amp;#039;camel.perlfect.com&amp;#039;);&lt;br /&gt;
$telnet-&amp;gt;waitfor(&amp;#039;/login: $/i&amp;#039;);&lt;br /&gt;
$telnet-&amp;gt;print(&amp;#039;bilbo&amp;#039;);&lt;br /&gt;
$telnet-&amp;gt;waitfor(&amp;#039;/password: $/i&amp;#039;);&lt;br /&gt;
$telnet-&amp;gt;print(&amp;#039;baggins&amp;#039;);&lt;br /&gt;
$telnet-&amp;gt;waitfor(&amp;#039;/\$ $/i&amp;#039;);&lt;br /&gt;
$telnet-&amp;gt;print(&amp;#039;who&amp;#039;);&lt;br /&gt;
$output = $telnet-&amp;gt;waitfor(&amp;#039;/\$ $/i&amp;#039;);&lt;br /&gt;
print $output;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://search.cpan.org/~jrogers/Net-Telnet-3.03/lib/Net/Telnet.pm Net::Telnet - interact with TELNET port or other TCP ports - search.cpan.org]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use Net::Telnet ();&lt;br /&gt;
$t = new Net::Telnet (Timeout =&amp;gt; 10,&lt;br /&gt;
  Prompt =&amp;gt; &amp;#039;/bash\$ $/&amp;#039;);&lt;br /&gt;
$t-&amp;gt;open(&amp;quot;sparky&amp;quot;);&lt;br /&gt;
$t-&amp;gt;login($username, $passwd);&lt;br /&gt;
@lines = $t-&amp;gt;cmd(&amp;quot;who&amp;quot;);&lt;br /&gt;
print @lines;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.wellho.net/resources/P616.html Perl - FTP and Telnet Modules]&lt;br /&gt;
&lt;br /&gt;
=== Threads ===&lt;br /&gt;
&lt;br /&gt;
[http://perldoc.perl.org/perlthrtut.html perlthrtut - Tutorial on threads in Perl (perldoc.perl.org)]&lt;br /&gt;
&lt;br /&gt;
Your programs can use the Config module to check whether threads are enabled.&lt;br /&gt;
 use Config;&lt;br /&gt;
 $Config{useithreads} or die(&amp;#039;Recompile Perl with threads to run this program.&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
Example threaded program:&lt;br /&gt;
 use threads;&lt;br /&gt;
 &lt;br /&gt;
 @ParamList = (42, &amp;quot;Hello World&amp;quot;);&lt;br /&gt;
 my $thr = threads-&amp;gt;create(\&amp;amp;sub1, @ParamList);&lt;br /&gt;
 &lt;br /&gt;
 # To wait for a thread to exit and extract any values it might return, you can use the join() method:&lt;br /&gt;
 my @ReturnData = $thr-&amp;gt;join();&lt;br /&gt;
 print(&amp;#039;Thread returned &amp;#039;, join(&amp;#039;, &amp;#039;, @ReturnData), &amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 sub sub1 {&lt;br /&gt;
   my @InboundParameters = @_;&lt;br /&gt;
   print(&amp;quot;In the thread\n&amp;quot;);&lt;br /&gt;
   print(&amp;#039;Got parameters &amp;gt;&amp;#039;, join(&amp;#039;&amp;lt;&amp;gt;&amp;#039;, @InboundParameters), &amp;quot;&amp;lt;\n&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Synchronize with lock($var).&lt;br /&gt;
&lt;br /&gt;
Note that there is no unlock()  function - the only way to unlock a variable is to allow it to go out of scope.&lt;br /&gt;
&lt;br /&gt;
Sleep&lt;br /&gt;
 sleep $milisec;&lt;br /&gt;
&lt;br /&gt;
Loop through all the threads&lt;br /&gt;
 foreach my $thr (threads-&amp;gt;list()) {&lt;br /&gt;
   $thr-&amp;gt;join();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Shared data:&lt;br /&gt;
 use threads::shared;&lt;br /&gt;
 my $total :shared = 0;&lt;br /&gt;
&lt;br /&gt;
Example with shared data and forced yields:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl -w&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use threads &amp;#039;yield&amp;#039;;&lt;br /&gt;
use threads::shared;&lt;br /&gt;
&lt;br /&gt;
my $var : shared = 0;&lt;br /&gt;
&lt;br /&gt;
sub tsub {&lt;br /&gt;
  my ($name) = @_;&lt;br /&gt;
  for(my $i = 1 ; $i &amp;lt; 10 ; $i ++ ) {&lt;br /&gt;
    yield();&lt;br /&gt;
    print &amp;quot;$name] $var\n&amp;quot;;&lt;br /&gt;
    $var++;&lt;br /&gt;
    yield();&lt;br /&gt;
    # sleep random time&lt;br /&gt;
    select(undef,undef,undef,2 * (int(rand(100))/100) );&lt;br /&gt;
    yield();&lt;br /&gt;
  }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
my $t1 = threads-&amp;gt;new( \&amp;amp;tsub , &amp;quot;t1&amp;quot; );&lt;br /&gt;
my $t2 = threads-&amp;gt;new( \&amp;amp;tsub , &amp;quot;t2&amp;quot; );&lt;br /&gt;
my $t3 = threads-&amp;gt;new( \&amp;amp;tsub , &amp;quot;t3&amp;quot; );&lt;br /&gt;
my $t4 = threads-&amp;gt;new( \&amp;amp;tsub , &amp;quot;t4&amp;quot; );&lt;br /&gt;
my $t5 = threads-&amp;gt;new( \&amp;amp;tsub , &amp;quot;t5&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
# cleanup&lt;br /&gt;
my $retval;&lt;br /&gt;
$retval = $t1-&amp;gt;join();&lt;br /&gt;
$retval = $t2-&amp;gt;join();&lt;br /&gt;
$retval = $t3-&amp;gt;join();&lt;br /&gt;
$retval = $t4-&amp;gt;join();&lt;br /&gt;
$retval = $t5-&amp;gt;join();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MySQL ===&lt;br /&gt;
&lt;br /&gt;
==== Mysql example ====&lt;br /&gt;
&lt;br /&gt;
perlinsertquery.pl:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
#&lt;br /&gt;
# Source: http://www.tizag.com/perlT/perlmysqlquery.php&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
use Mysql;&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Content-type: text/html \n\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# MYSQL CONFIG VARIABLES&lt;br /&gt;
$host = &amp;quot;localhost&amp;quot;;&lt;br /&gt;
$database = &amp;quot;store&amp;quot;;&lt;br /&gt;
$tablename = &amp;quot;inventory&amp;quot;;&lt;br /&gt;
$user = &amp;quot;username&amp;quot;;&lt;br /&gt;
$pw = &amp;quot;password&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# PERL MYSQL CONNECT()&lt;br /&gt;
$connect = Mysql-&amp;gt;connect($host, $database, $user, $pw);&lt;br /&gt;
&lt;br /&gt;
# SELECT DB&lt;br /&gt;
$connect-&amp;gt;selectdb($database);&lt;br /&gt;
&lt;br /&gt;
# DEFINE A MySQL QUERY&lt;br /&gt;
$myquery = &amp;quot;INSERT INTO &lt;br /&gt;
$tablename (id, product, quantity) &lt;br /&gt;
VALUES (DEFAULT,&amp;#039;pineapples&amp;#039;,&amp;#039;15&amp;#039;)&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# EXECUTE THE QUERY FUNCTION&lt;br /&gt;
$execute = $connect-&amp;gt;query($myquery);&lt;br /&gt;
&lt;br /&gt;
# AFFECTED ROWS&lt;br /&gt;
$affectedrows = $execute-&amp;gt;affectedrows($myquery);&lt;br /&gt;
&lt;br /&gt;
# ID OF LAST INSERT&lt;br /&gt;
$lastid = $execute-&amp;gt;insertid($myquery);&lt;br /&gt;
&lt;br /&gt;
print $affectedrows.&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;&lt;br /&gt;
print $lastid.&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
easyselectfunctions.pl:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
#&lt;br /&gt;
# Source: http://www.tizag.com/perlT/perlmysqlquery.php&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
use Mysql;&lt;br /&gt;
&lt;br /&gt;
# HTTP HEADER&lt;br /&gt;
print &amp;quot;Content-type: text/html \n\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# MYSQL CONFIG VARIABLES&lt;br /&gt;
$host = &amp;quot;localhost&amp;quot;;&lt;br /&gt;
$database = &amp;quot;store&amp;quot;;&lt;br /&gt;
$tablename = &amp;quot;inventory&amp;quot;;&lt;br /&gt;
$user = &amp;quot;username&amp;quot;;&lt;br /&gt;
$pw = &amp;quot;password&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# PERL MYSQL CONNECT()&lt;br /&gt;
$connect = Mysql-&amp;gt;connect($host, $database, $user, $pw);&lt;br /&gt;
&lt;br /&gt;
# SELECT DB&lt;br /&gt;
$connect-&amp;gt;selectdb($database);&lt;br /&gt;
&lt;br /&gt;
# DEFINE A MySQL QUERY&lt;br /&gt;
$myquery = &amp;quot;SELECT * FROM $tablename&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# EXECUTE THE QUERY&lt;br /&gt;
$execute = $connect-&amp;gt;query($myquery);&lt;br /&gt;
&lt;br /&gt;
$rownumber = $execute-&amp;gt;numrows();&lt;br /&gt;
$fieldnumber = $execute-&amp;gt;numfields();&lt;br /&gt;
&lt;br /&gt;
# PRINT THE RESULTS&lt;br /&gt;
print $rownumber.&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;&lt;br /&gt;
print $fieldnumber.&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fetchrow.pl:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
#&lt;br /&gt;
# Source: http://www.tizag.com/perlT/perlmysqlquery.php&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
use Mysql;&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Content-type: text/html \n\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# MYSQL CONFIG VARIABLES&lt;br /&gt;
$host = &amp;quot;localhost&amp;quot;;&lt;br /&gt;
$database = &amp;quot;store&amp;quot;;&lt;br /&gt;
$tablename = &amp;quot;inventory&amp;quot;;&lt;br /&gt;
$user = &amp;quot;username&amp;quot;;&lt;br /&gt;
$pw = &amp;quot;password&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# PERL MYSQL CONNECT()&lt;br /&gt;
$connect = Mysql-&amp;gt;connect($host, $database, $user, $pw);&lt;br /&gt;
&lt;br /&gt;
# SELECT DB&lt;br /&gt;
$connect-&amp;gt;selectdb($database);&lt;br /&gt;
&lt;br /&gt;
# DEFINE A MySQL QUERY&lt;br /&gt;
$myquery = &amp;quot;SELECT * FROM $tablename&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# EXECUTE THE QUERY FUNCTION&lt;br /&gt;
$execute = $connect-&amp;gt;query($myquery);&lt;br /&gt;
&lt;br /&gt;
# HTML TABLE&lt;br /&gt;
print &amp;quot;&amp;lt;table border=&amp;#039;1&amp;#039;&amp;gt;&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;id&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;product&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;quantity&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# FETCHROW ARRAY&lt;br /&gt;
&lt;br /&gt;
while (@results = $execute-&amp;gt;fetchrow()) {&lt;br /&gt;
	print &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
	.$results[0].&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
	.$results[1].&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
	.$results[2].&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Source: [http://www.tizag.com/perlT/perlmysqlquery.php Perl Tutorial - MySQL Query]&lt;br /&gt;
&lt;br /&gt;
==== DBD::mysql Example ====&lt;br /&gt;
&lt;br /&gt;
Connect to MySQL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use DBI;&lt;br /&gt;
$dbh = DBI-&amp;gt;connect(&amp;#039;DBI:mysql:databasename&amp;#039;, &amp;#039;username&amp;#039;, &amp;#039;password&amp;#039;&lt;br /&gt;
	           ) || die &amp;quot;Could not connect to database: $DBI::errstr&amp;quot;;&lt;br /&gt;
# (insert query examples here...)&lt;br /&gt;
$dbh-&amp;gt;disconnect();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Connect to a different host:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$dbh = DBI-&amp;gt;connect(&amp;#039;DBI:mysql:databasename;host=db.example.com&amp;#039;, &amp;#039;username&amp;#039;, &amp;#039;password&amp;#039;,&lt;br /&gt;
	            { RaiseError =&amp;gt; 1 }&lt;br /&gt;
	           );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Simple query:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$dbh-&amp;gt;do(&amp;#039;CREATE TABLE exmpl_tbl (id INT, val VARCHAR(100))&amp;#039;);&lt;br /&gt;
$dbh-&amp;gt;do(&amp;#039;INSERT INTO exmpl_tbl VALUES(1, ?)&amp;#039;, undef, &amp;#039;Hello&amp;#039;);&lt;br /&gt;
$dbh-&amp;gt;do(&amp;#039;INSERT INTO exmpl_tbl VALUES(2, ?)&amp;#039;, undef, &amp;#039;World&amp;#039;);&lt;br /&gt;
$c = $dbh-&amp;gt;do(&amp;#039;DELETE FROM exmpl_tbl WHERE id=1&amp;#039;);&lt;br /&gt;
print &amp;quot;Deleted $c rows\n&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typical query:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$sth = $dbh-&amp;gt;prepare(&amp;#039;SELECT val FROM exmpl_tbl WHERE id=1&amp;#039;);&lt;br /&gt;
$sth-&amp;gt;execute();&lt;br /&gt;
$result = $sth-&amp;gt;fetchrow_hashref();&lt;br /&gt;
print &amp;quot;Value returned: $result-&amp;gt;{val}\n&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Query using placeholders:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$sth = $dbh-&amp;gt;prepare(&amp;#039;SELECT id FROM exmpl_tbl WHERE val=?&amp;#039;,&lt;br /&gt;
undef, &amp;#039;World&amp;#039;);&lt;br /&gt;
@result = $sth-&amp;gt;fetchrow_array();&lt;br /&gt;
print &amp;quot;ID of World is $result[0]\n&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Execute and fetch in one command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$sth = $dbh-&amp;gt;prepare(&amp;#039;SELECT * FROM exmpl_tbl&amp;#039;);&lt;br /&gt;
$results = $dbh-&amp;gt;selectall_hashref(&amp;#039;SELECT * FROM exmpl_tbl&amp;#039;, &amp;#039;id&amp;#039;);&lt;br /&gt;
foreach my $id (keys %$results) {&lt;br /&gt;
  print &amp;quot;Value of ID $id is $results-&amp;gt;{$id}-&amp;gt;{val}\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Source: [http://sql-info.de/mysql/examples/Perl-DBI-examples.html Perl DBI examples (DBD::mysql)]&lt;br /&gt;
&lt;br /&gt;
== Big O Notation - Optimizing Your Perl ==&lt;br /&gt;
&lt;br /&gt;
[http://www.perl.com/lpt/a/623 Perl.com: Optimizing Your Perl]:&lt;br /&gt;
&lt;br /&gt;
:&amp;quot;Computer scientists and mathematicians use a system called big-O notation to describe the order of magnitude of how long something will take. Big-O notation represents a worst-case analysis.&lt;br /&gt;
&lt;br /&gt;
:If the runtime of a function is constant, then this is written as O(1). (Note the capital or &amp;quot;big&amp;quot; O.) Constant means that no matter how much data is processed, (i.e., how much input there is) the time doesn&amp;#039;t change.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:If the runtime is directly related to the amount of input (a.k.a. linear), then this is O(n). If there is twice as much input, then the algorithm will take twice as long to run. Some functions are O(n^2) (quadratic) or O(n^3) (cubic) or even worse.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:Because we are only looking at orders of magnitude (is the operation going to take one minute or one hour) we can ignore constant factors and smaller terms. O(2n) and O(n) are equivalent. As are O(n+1) and O(n) or O(n^2+n) and  O(n^2). The smaller term is insignificant compared to the larger.&lt;br /&gt;
&lt;br /&gt;
:There are rules for analyzing code and determining its big-O, but the simplest way is to look at how many times you iterate over the data. if you don&amp;#039;t iterate, then it&amp;#039;s O(1). If you iterate over it once, then it&amp;#039;s O(n). If you have two nested loops, then it&amp;#039;s probably O(n^2).&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Other references:&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Big_O_notation Big O notation - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Recommended Perl Books ==&lt;br /&gt;
&lt;br /&gt;
Perl Cookbook - Tips and Tricks for Perl Programmers&lt;br /&gt;
: by Tom Christiansen, Nat Torkington&lt;br /&gt;
: ISBN 10: 1-56592-243-3 | ISBN 13: 9781565922433&lt;br /&gt;
: O&amp;#039;Reilly Media&lt;br /&gt;
: August 1998&lt;br /&gt;
: Pages: 794 &lt;br /&gt;
: Out of date&lt;br /&gt;
&lt;br /&gt;
Perl Cookbook, Second Edition&lt;br /&gt;
: By Tom Christiansen, Nat Torkington&lt;br /&gt;
: August 2003&lt;br /&gt;
: Pages: 964&lt;br /&gt;
: ISBN 10: 0-596-00313-7 | ISBN 13: 9780596003135&lt;br /&gt;
: Print $49.95&lt;br /&gt;
: Print+Ebook $64.93&lt;br /&gt;
: Ebook $39.99&lt;br /&gt;
&lt;br /&gt;
Perl for Dummies (Third Edition)&lt;br /&gt;
: (Paperback)&lt;br /&gt;
: [http://www.amazon.com/Perl-Dummies-Third-Paul-Hoffman/dp/0764507761 Amazon]&lt;br /&gt;
&lt;br /&gt;
Learning Perl, 5th Edition&lt;br /&gt;
: (Paperback)&lt;br /&gt;
: [http://www.amazon.com/Learning-Perl-5th-Randal-Schwartz/dp/0596520107/ref=pd_sim_b_1 Amazon]&lt;br /&gt;
: Print $26.39&lt;br /&gt;
: ISBN-10: 0596520107&lt;br /&gt;
: ISBN-13: 978-0596520106&lt;br /&gt;
: Paperback: 348 pages&lt;br /&gt;
: Publisher: O&amp;#039;Reilly Media, Inc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*perl for dummies&lt;br /&gt;
*Perl 5 for Dummies&lt;br /&gt;
*Perl for System Administration&lt;br /&gt;
*Programming Perl&lt;br /&gt;
*Learning Perl&lt;br /&gt;
*Perl by Example&lt;br /&gt;
*Perl Best Practices&lt;br /&gt;
*http://oreilly.com/perl/&lt;br /&gt;
*https://fedoraproject.org/wiki/Perl_Basics_Classroom_(20090307)&lt;br /&gt;
**http://www.xmission.com/~fozz/perl_basics.pdf&lt;br /&gt;
*The Perl CD Bookshelf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://2020ok.com/books/16/perl-for-system-administration-20916.htm Perl For System Administration Download]&lt;br /&gt;
*http://serghei.net/docs/programming/perl/perl2/sysadmin/index.htm&lt;br /&gt;
*http://www.goldfish.org/books/O%27Reilly%20Perl%20CD%20Bookshelf%202.0/sysadmin/&lt;br /&gt;
&lt;br /&gt;
== keywords ==&lt;br /&gt;
&lt;br /&gt;
linux perl&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Kenneth</name></author>
	</entry>
</feed>