Go Back   DN Lodge Webmaster Forums > Web Design and Development > Programming


Reply
 
LinkBack Thread Tools Display Modes
  #1  
Old 09-22-06, 11:31 PM
Geoserv's Avatar
Co-Admin
DNLodge Staff
 
Join Date: May 2006
Location: Nova Scotia, Canada
Posts: 1,827
DNL Trust: (0)
Geoserv has a helpful personalityGeoserv has a helpful personality
Default Perl Faq

- How do I delete a file using Perl?
To delete files you use the unlink() function. Here are a few examples of how the unlink() function can be used:
Code:
$cnt = unlink 'a', 'b', 'c';
unlink @goners;
unlink <*.bak>;
unlink("/path/to/file.bak");
- How do I delete a directory using Perl?
To delete a directory you use the rmdir() function. Directories must be empty before they can be deleted.
Code:
rmdir(DIRNAME)
-How do I rename a file or directory using Perl?
To rename a file or directory you use the rename() function.
Code:
rename(OLDNAME,NEWNAME);
-How do I CHMOD a file using Perl?
To CHMOD (set file/folder permissions) you use the chmod() function. Some examples:
Code:
chmod 0755, @executables;
chmod 0644, filename;
$cnt = chmod 0644, 'file1','file2','file3';
-How Can I find Occurences in Lines Between Two Patterns Using Perl?
Assuming the two patterns are START and END you can do something like this:
Code:
open (FILE,"yourfile");
while ( <FILE> ) {
   push(@temp,$1) if (/START(.*?)END/gs);
}
close(FILE);
any occurences of a match will be stored in the @temp array in the above example.


If you just wanted to print the lines that had the two patterns and not worry about what was between the patterns you can do something like this:

Code:
open (FILE,"yourfile");
while ( <FILE> ) {
   print "$_\n" if (/START/ .. /END/);
}
close(FILE);
-How can I know what's causing a 500 Internal Error Message?
When you see the typical "500 Internal Server Error" message it's not much help at understandling what went wrong and is causing the script to crash and burn. To see a much better error message place this code at the beginning of your Perl script, but below the very first line of the script:
Code:
use CGI::Carp qw(fatalsToBrowser);
This will force Perl to display in your browser a more detailed description of what is causing your script to crash.

You should use it when debugging problems but remove it or comment it out once your script is running properly.

If you still get a 500 Internal Server Error after inserting that line just below the first line of your Perl script, which will look something like this:

#!/usr/bin/perl

that generally means the very first line is the wrong path to Perl or there is a syntax error in that line. Make sure the line starts with a number sign, follwed by an exclamation:

#!

and check with your host that you are using the correct path to Perl.

-How Can I See a List of the Perl Modules Installed on My Server?
This short script should work on just about any server to list the Perl modules installed on the server or your hosts server. It might take a moment to run and display so be patient if the list takes a few moments to display in your browser.**
Code:
#!/usr/bin/perl -w
use CGI;
use strict;
use File::Find;
my %list;
my $q = new CGI;
print $q->header();

find (\&wanted, @INC);

sub wanted {
   next if (/^\.{1,2}$/);
   $list{$_} = $_  if -f && /\.pm$/;
}

my @sorted = sort { lc($a) cmp lc($b) } keys %list;
my $cnt = @sorted;
print "$cnt unique modules found.<br /><br />";
print "$_<br />\n" for @sorted;
** this script is provided as-is, no warranty of fitness is expressed or implied. Install and use if you know how, I will not answer questions or provide support for the script.

-Should I always quote my "$variables"?
In general it does no harm to quote your $variables, but its not good Perl programming practice to do so and most of the time is not necessary. When you double-quote your variables you force Perl to make them into strings (stingification), but they already are strings, why do it over again? Numbers do not have to be quoted unless you want them in a string context. Some examples to consider:

$num = "123"; #BAD
$num = 123; #GOOD

somefunction("$num"); #BAD
somefunction($num); #GOOD

$word = 'a string of words';
$copy = "$word"; #BAD
$copy = $word; #GOOD

print "$sentence"; #BAD
print $sentence; #GOOD


also, if you double-quote an array when printing it Perl adds extra spaces, or blanks, between the array elements. This sometimes is handy but sometimes it's not.

@array = `some_command`;
print "@array"; #might not be what you expect
print @array; #printed with no extra blanks

OK, so double-quoting for the most part is not a big deal, but it's better to not quote variables when they shouldn't be quoted. Could save you some typing too.

-What does "Can't Find String Terminator "XXX" Anywhere Before EOF" error mean?
This most often seems to happen when using the print command like this to print some output to the screen:
Code:
print <<"EOF";
Hello, my name is Kevin
EOF
The last line, EOF, which is the end of string terminator, must be flush against the left margin and no spaces or other characters should be to the right of it on the same line.

-How can I output my numbers with commas added?
This subroutine will add commas to your numbers:
Code:
sub commify {
   local $_  = shift;
   1 while s/^([-+]?\d+)(\d{3})/$1,$2/;
   return $_;
}
You call the subroutine where needed in your script, something like:

$num = 16574.33 + 19983745.21;
commify($num);
print $num;

This regex from Benjamin Goldberg will also add commas to numbers:
Code:
s/(^[-+]?\d+?(?=(?>(?:\d{3})+)(?!\d))|\G\d{3}(?=\d))/$1,/g;
** this one is quoted directly from the Perl 5.8.4 Documentation (perlfaq5 - Files and Formats)

I will post more soon.

Geoserv.

PART II

- How can I run/test Perl scripts on my Windows PC?
Besides a Perl interpreter, you also need a web server software installed. If you're running Windows, I can tell you how to install Apache and ActivePerl, to run Perl on your own computer.

First, download the Apache 2 binary distribution from apache.org. When the installer prompts you, set "Network Domain" and "Server Name" to localhost, and "Administrator's Email Address" to your own email addy. Choose the "Typical" setup mode, the default installation folder (C:\Program Files\Apache Group\) is good. When installation is finished, Apache should start automatically as a Windows service. You can check if it's working by going to http://localhost/ (or if you prefer, http://127.0.0.1/) in your web browser. You can now save your files in the /htdocs directory inside the directory you installed Apache in, and access them through http://localhost/filename.

Then, download the ActivePerl package from www.activestate.com. Notice that registering is voluntary. Choose the newest build and Windows / MSI (a Windows installer package). When installing, leave the Custom Setup settings as they are, as well as the installation directory (C:\Perl\). In the next screen, leave "Enable PPM3 to send profile info to ASPN" unchecked. In the next screen, check both "Add Perl to the PATH environment variable" and "Create Perl file extension association". Then the installer will copy all files and generate the HTML documentation - generating the documentation will take a good while so just be patient.

Now you have the Perl interpreter installed, and you can run Perl scripts in it, but to run them through your web browser (as CGI scripts), you still need to configure Apache a little. Go to the Windows start menu -> Programs -> Apache HTTP Server 2.0.xxx -> Configure Apache Server -> Edit the Apache httpd.conf Configuration File, and some code should open up in Notepad. Hit Ctrl+F or choose Edit -> Find (in Notepad), type cgi-script and hit "Find Next". You should come to a line that says #AddHandler cgi-script .cgi. Uncomment it, i.e. remove the pound sign (#) from the beginning of it. Also set it to interpret .pl files as CGI scripts, so you have AddHandler cgi-script .cgi .pl. Then save the file and restart Apache from Start menu -> Programs -> Apache HTTP Server 2.0.xxx -> Control Apache Server -> Restart. You can now save your Perl scripts in the /cgi-bin directory, that is located in the same dir as /htdocs. You run them in your browser through http://localhost/cgi-bin/filename.cgi.

You will also have to use a different shebang line when running Perl scripts on your localhost server. Instead of the typicl web host server shebang line that is similar to this:

#!/usr/bin/perl

you will use:

#!/perl/bin/perl.exe

or

#!C:/perl/bin/perl.exe

or

#!perl

whichever one works for your setup.


If you wish to be able to run Perl scripts from the /htdocs directory too, edit the httpd.conf file again (Start menu -> Programs -> Apache HTTP Server 2.0.xxx -> Configure Apache Server -> Edit the Apache httpd.conf Configuration File), hit Ctrl+F, and search for <Directory, you probably need to search several times before coming to a line that says <Directory "C:/Program Files/Apache Group/Apache2/htdocs"> (the path you see depends on where you installed Apache, that is the default installation directory). Everything below that until a closing </Directory> (reminds you of HTML doesn't it) are instructions for the /htdocs directory. Inside that block, find a line saying Options Indexes FollowSymLinks, amend it to Options Indexes FollowSymLinks ExecCGI, save the file and restart Apache (Start menu -> Programs -> Apache HTTP Server 2.0.xxx -> Control Apache Server -> Restart). You can now run your CGI scripts in /htdocs too.


At the moment, only .cgi files are ran as CGI scripts, but you may want to run other extensions, such as .pl, .py, .tcl or .rb as CGIs too. Edit the httpd.conf configuration file again, find the line that says AddHandler cgi-script .cgi, change it to AddHandler cgi-script .cgi .pl (you can add as many extensions as you want), then save the file and restart Apache.


There is still one thing you may want to edit; setting Apache to see index.cgi (and index.pl) as directory index files, just like index.html and index.htm are seen. Edit httpd.conf again, and find DirectoryIndex from the file. You should come to a line saying DirectoryIndex index.html index.html.var, amend it to DirectoryIndex index.html index.html.var index.cgi index.pl. You can also add index.htm to it, if you prefer the .htm extension to .html. Then save the file and restart Apache.

- Perl Programming and Memory Usage
Here are some basic tips for keeping memory usage low.

Don't do what is sometimes called "slurping" files:
Code:
open (FILE,"yourfile");
@data = <FILE>;
foreach (@data) {
   #do something
}
close(FILE);
this reads the entire file into memory. If its just a small file then its not really a big deal.

But this is much better as far as memory consumption is concerned:

Code:
open (FILE,"yourfile");
while (<FILE>) {
   #do something
}
close(FILE);
If you have files with thousands and thousands (or more) of lines you probably should be using a while loop.

Use "grep" and "map" only when you really have to as they also slurp files into memory. You can probably use a while loop instead of "grep" or "map" in many situations.

Don't use double-quotes when you don't need to.

- How Do I Check the Length of a String?
To check the length of a string using Perl you use the length() function. Some examples:
Code:
$name = 'Jennifer';

$length = 8;
if (length($name) > $length) {
print "Too long";
}

$num = length($name);
if ($num > 8) {
print "Too long";
}
- How Do I Select a Random Element From an Array?
To select a random element from an array using perl you use the rand function. Some examples:
Code:
@DATA = qw(cat dog fish cow horse pig camel giraffe); 

#example 1
$random_element = $DATA[int(rand @DATA)];

#example 2
$index = rand @DATA;
$random_element = @DATA[$index];
if you are using a version of Perl older than 5.004 you must use srand() before trying to select a random element.

Code:
srand():

@DATA = qw(cat dog fish cow horse pig camel giraffe); 

#example 1
$random_element = $DATA[int(rand @DATA)];

#example 2
$index = rand @DATA;
$random_element = @DATA[$index];
you can only call srand() once per program.

Perl version 5.004 and higher automatically calls srand() unless srand() has already been called.

- How Can I Determine the NUmber of Elements in an Array?
To determine the number of elements in an array you assign the array to a scalar variable:

Code:
@DATA = qw(cat dog fish cow horse pig camel giraffe); 
$number_of_elements = @DATA;
print $number_of_elements;
$number_of_elements will equal 8 for the above example. $DATA[0] through $DATA[7] equals 8 elements.

- [b]
__________________
Latest Web Launches: Get In On! - Brand NEW!
Join me at - Second Brain
Top Stumbles |News Dots |APNAOnline | Utopian Productions |Pliggs |DIY Pad
|FAQ Pal
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
Want to remove these ads? Register for your free account here.

  #2  
Old 09-23-06, 12:10 AM
Alter Ego
 
Join Date: Jan 2006
Posts: 475
DNL Trust: (0)
Send a message via MSN to linuxhq
linuxhq is making his way to the top
Default Re: Perl Faq

Very nice, keep it up!
__________________

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #3  
Old 09-23-06, 12:18 AM
Geoserv's Avatar
Co-Admin
DNLodge Staff
 
Join Date: May 2006
Location: Nova Scotia, Canada
Posts: 1,827
DNL Trust: (0)
Geoserv has a helpful personalityGeoserv has a helpful personality
Default Re: Perl Faq

Thank you linuxhq.

Geoserv.
__________________
Latest Web Launches: Get In On! - Brand NEW!
Join me at - Second Brain
Top Stumbles |News Dots |APNAOnline | Utopian Productions |Pliggs |DIY Pad
|FAQ Pal
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #4  
Old 09-23-06, 11:30 PM
Alter Ego
 
Join Date: Jan 2006
Posts: 475
DNL Trust: (0)
Send a message via MSN to linuxhq
linuxhq is making his way to the top
Default Re: Perl Faq II

Ive merged Perl I and Perl II and stuck the thread.
This is a very nice tutorial, keep it up!
__________________

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #5  
Old 09-25-06, 07:18 AM
Geoserv's Avatar
Co-Admin
DNLodge Staff
 
Join Date: May 2006
Location: Nova Scotia, Canada
Posts: 1,827
DNL Trust: (0)
Geoserv has a helpful personalityGeoserv has a helpful personality
Default Re: Perl Faq

Thank you,

Geoserv.
__________________
Latest Web Launches: Get In On! - Brand NEW!
Join me at - Second Brain
Top Stumbles |News Dots |APNAOnline | Utopian Productions |Pliggs |DIY Pad
|FAQ Pal
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #6  
Old 10-19-06, 10:32 PM
DNL Newbie
 
Join Date: Oct 2006
Posts: 9
DNL Trust: (0)
cardcaptor sugee is a pretty decent person
Default Re: Perl Faq

Omg That Is Such A Good Info Lol Thank You !!!
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #7  
Old 10-21-06, 04:57 PM
DNL Member
 
Join Date: Oct 2006
Posts: 10
DNL Trust: (0)
TheArbiter is a pretty decent person
Default Re: Perl Faq

nice little bit of info!
thanks alot
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #8  
Old 10-23-06, 10:40 PM
DNL Professional
 
Join Date: Sep 2006
Posts: 664
DNL Trust: (0)
arcadepunk is a pretty decent person
Default Re: Perl Faq

nice one GeoServ. Ive been wanting to know for a while now though, did you write this whole thing :O
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #9  
Old 10-24-06, 08:02 AM
Geoserv's Avatar
Co-Admin
DNLodge Staff
 
Join Date: May 2006
Location: Nova Scotia, Canada
Posts: 1,827
DNL Trust: (0)
Geoserv has a helpful personalityGeoserv has a helpful personality
Default Re: Perl Faq

I didn't write it. A firend gave it to me, so I have no idea who did.

And when I say friend, I use that word losely.

Geoserv.
__________________
Latest Web Launches: Get In On! - Brand NEW!
Join me at - Second Brain
Top Stumbles |News Dots |APNAOnline | Utopian Productions |Pliggs |DIY Pad
|FAQ Pal
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #10  
Old 10-24-06, 11:06 PM
DNL Professional
 
Join Date: Sep 2006
Posts: 664
DNL Trust: (0)
arcadepunk is a pretty decent person
Default Re: Perl Faq

lol ok I found a thread with the same FAQs posted on another site but wasnt sure if that person wrote it either. I guess the author is a mystery.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
Reply

Bookmarks

Tags
faq, perl


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

Similar Threads
Thread Thread Starter Forum Replies Last Post
Perl? run2me Programming 7 10-25-05 07:18 PM


All times are GMT -4. The time now is 11:01 PM.



Copyright © 2005-2008 DNLodge.com.
vBulletin, © 2000-2008, Jelsoft Enterprises Limited.
SEO by vBSEO.
Advertising |  About Us |  Contact Us |  Sitemap |  RSS |  Privacy Policy |  Back to Top