Cari di Perl 
    Perl Tutorial
Daftar Isi
(Sebelumnya) Obtaining and Learning about PerlData Manipulation (Berikutnya)
FAQs

Programming Tools

Daftar Isi

NAME

perlfaq3 - Programming Tools

DESCRIPTION

This section of the FAQ answers questions related to programmer toolsand programming support.

How do I do (anything)?

Have you looked at CPAN (see perlfaq2)? The chances are thatsomeone has already written a module that can solve your problem.Have you read the appropriate manpages? Here's a brief index:

  • Basics
  • Execution
  • Functions
  • Objects
    • perlref - Perl references and nested data structures
    • perlmod - Perl modules (packages and symbol tables)
    • perlobj - Perl objects
    • perltie - how to hide an object class in a simple variable
  • Data Structures
    • perlref - Perl references and nested data structures
    • perllol - Manipulating arrays of arrays in Perl
    • perldsc - Perl Data Structures Cookbook
  • Modules
    • perlmod - Perl modules (packages and symbol tables)
    • perlmodlib - constructing new Perl modules and finding existing ones
  • Regexes
    • perlre - Perl regular expressions
    • perlfunc - Perl builtin functions>
    • perlop - Perl operators and precedence
    • perllocale - Perl locale handling (internationalization and localization)
  • Moving to perl5
  • Linking with C
    • perlxstut - Tutorial for writing XSUBs
    • perlxs - XS language reference manual
    • perlcall - Perl calling conventions from C
    • perlguts - Introduction to the Perl API
    • perlembed - how to embed perl in your C program
  • Various

    http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz(not a man-page but still useful, a collection of various essays onPerl techniques)

A crude table of contents for the Perl manpage set is found in perltoc.

How can I use Perl interactively?

The typical approach uses the Perl debugger, described in theperldebug(1) manpage, on an "empty" program, like this:

  1. perl -de 42

Now just type in any legal Perl code, and it will be immediatelyevaluated. You can also examine the symbol table, get stackbacktraces, check variable values, set breakpoints, and otheroperations typically found in symbolic debuggers.

You can also use Devel::REPL which is an interactive shell for Perl,commonly known as a REPL - Read, Evaluate, Print, Loop. It providesvarious handy features.

How do I find which modules are installed on my system?

From the command line, you can use the cpan command's -l switch:

  1. $ cpan -l

You can also use cpan's -a switch to create an autobundle filethat CPAN.pm understands and can use to re-install every module:

  1. $ cpan -a

Inside a Perl program, you can use the ExtUtils::Installed module toshow all installed distributions, although it can take awhile to doits magic. The standard library which comes with Perl just shows upas "Perl" (although you can get those with Module::CoreList).

  1. use ExtUtils::Installed;
  2. my $inst = ExtUtils::Installed->new();
  3. my @modules = $inst->modules();

If you want a list of all of the Perl module filenames, youcan use File::Find::Rule:

  1. use File::Find::Rule;
  2. my @files = File::Find::Rule->
  3. extras({follow => 1})->
  4. file()->
  5. name( '*.pm' )->
  6. in( @INC )
  7. ;

If you do not have that module, you can do the same thingwith File::Find which is part of the standard library:

  1. use File::Find;
  2. my @files;
  3. find(
  4. {
  5. wanted => sub {
  6. push @files, $File::Find::fullname
  7. if -f $File::Find::fullname && /\.pm$/
  8. },
  9. follow => 1,
  10. follow_skip => 2,
  11. },
  12. @INC
  13. );
  14. print join "\n", @files;

If you simply need to check quickly to see if a module isavailable, you can check for its documentation. If you canread the documentation the module is most likely installed.If you cannot read the documentation, the module might nothave any (in rare cases):

  1. $ perldoc Module::Name

You can also try to include the module in a one-liner to see ifperl finds it:

  1. $ perl -MModule::Name -e1

(If you don't receive a "Can't locate ... in @INC" error message, then Perlfound the module name you asked for.)

How do I debug my Perl programs?

(contributed by brian d foy)

Before you do anything else, you can help yourself by ensuring thatyou let Perl tell you about problem areas in your code. By turningon warnings and strictures, you can head off many problems beforethey get too big. You can find out more about these in strictand warnings.

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

Beyond that, the simplest debugger is the print function. Use itto look at values as you run your program:

  1. print STDERR "The value is [$value]\n";

The Data::Dumper module can pretty-print Perl data structures:

  1. use Data::Dumper qw( Dumper );
  2. print STDERR "The hash is " . Dumper( \%hash ) . "\n";

Perl comes with an interactive debugger, which you can start with the-d switch. It's fully explained in perldebug.

If you'd like a graphical user interface and you have Tk, you can useptkdb. It's on CPAN and available for free.

If you need something much more sophisticated and controllable, LeonBrocard's Devel::ebug (which you can call with the -D switch as -Debug)gives you the programmatic hooks into everything you need to write yourown (without too much pain and suffering).

You can also use a commercial debugger such as Affrus (Mac OS X), Komodofrom Activestate (Windows and Mac OS X), or EPIC (most platforms).

How do I profile my Perl programs?

(contributed by brian d foy, updated Fri Jul 25 12:22:26 PDT 2008)

The Devel namespace has several modules which you can use toprofile your Perl programs.

The Devel::NYTProf (New York Times Profiler) does both statementand subroutine profiling. It's available from CPAN and you also invokeit with the -d switch:

  1. perl -d:NYTProf some_perl.pl

It creates a database of the profile information that you can turn intoreports. The nytprofhtml command turns the data into an HTML reportsimilar to the Devel::Cover report:

  1. nytprofhtml

You might also be interested in using the Benchmark tomeasure and compare code snippets.

You can read more about profiling in Programming Perl, chapter 20,or Mastering Perl, chapter 5.

perldebguts documents creating a custom debugger if you need tocreate a special sort of profiler. brian d foy describes the processin The Perl Journal, "Creating a Perl Debugger",http://www.ddj.com/184404522 , and "Profiling in Perl"http://www.ddj.com/184404580 .

Perl.com has two interesting articles on profiling: "Profiling Perl",by Simon Cozens, http://www.perl.com/lpt/a/850 and "Debugging andProfiling mod_perl Applications", by Frank Wiles,http://www.perl.com/pub/a/2006/02/09/debug_mod_perl.html .

Randal L. Schwartz writes about profiling in "Speeding up Your PerlPrograms" for Unix Review,http://www.stonehenge.com/merlyn/UnixReview/col49.html , and "Profilingin Template Toolkit via Overriding" for Linux Magazine,http://www.stonehenge.com/merlyn/LinuxMag/col75.html .

How do I cross-reference my Perl programs?

The B::Xref module can be used to generate cross-reference reportsfor Perl programs.

  1. perl -MO=Xref[,OPTIONS] scriptname.plx

Is there a pretty-printer (formatter) for Perl?

Perl::Tidy comes with a perl script perltidy which indents andreformats Perl scripts to make them easier to read by trying to followthe rules of the perlstyle. If you write Perl, or spend much time readingPerl, you will probably find it useful.

Of course, if you simply follow the guidelines in perlstyle,you shouldn't need to reformat. The habit of formatting your codeas you write it will help prevent bugs. Your editor can and shouldhelp you with this. The perl-mode or newer cperl-mode for emacscan provide remarkable amounts of help with most (but not all)code, and even less programmable editors can provide significantassistance. Tom Christiansen and many other VI users swear bythe following settings in vi and its clones:

  1. set ai sw=4
  2. map! ^O {^M}^[O^T

Put that in your .exrc file (replacing the caret characterswith control characters) and away you go. In insert mode, ^T isfor indenting, ^D is for undenting, and ^O is for blockdenting--asit were. A more complete example, with comments, can be found athttp://www.cpan.org/authors/id/TOMC/scripts/toms.exrc.gz

Is there an IDE or Windows Perl Editor?

Perl programs are just plain text, so any editor will do.

If you're on Unix, you already have an IDE--Unix itself. The Unixphilosophy is the philosophy of several small tools that each do onething and do it well. It's like a carpenter's toolbox.

If you want an IDE, check the following (in alphabetical order, notorder of preference):

For editors: if you're on Unix you probably have vi or a vi clonealready, and possibly an emacs too, so you may not need to downloadanything. In any emacs the cperl-mode (M-x cperl-mode) gives youperhaps the best available Perl editing mode in any editor.

If you are using Windows, you can use any editor that lets you workwith plain text, such as NotePad or WordPad. Word processors, such asMicrosoft Word or WordPerfect, typically do not work since they insertall sorts of behind-the-scenes information, although some allow you tosave files as "Text Only". You can also download text editors designedspecifically for programming, such as Textpad (http://www.textpad.com/ ) and UltraEdit ( http://www.ultraedit.com/ ),among others.

If you are using MacOS, the same concerns apply. MacPerl (for Classicenvironments) comes with a simple editor. Popular external editors areBBEdit ( http://www.bbedit.com/ ) or Alpha (http://www.his.com/~jguyer/Alpha/Alpha8.html ). MacOS X users can useUnix editors as well.

or a vi clone such as

The following are Win32 multilanguage editor/IDEs that support Perl:

There is also a toyedit Text widget based editor written in Perlthat is distributed with the Tk module on CPAN. The ptkdb( http://ptkdb.sourceforge.net/ ) is a Perl/Tk-based debugger thatacts as a development environment of sorts. Perl Composer( http://perlcomposer.sourceforge.net/ ) is an IDE for Perl/TkGUI creation.

In addition to an editor/IDE you might be interested in a morepowerful shell environment for Win32. Your options include

MKS and U/WIN are commercial (U/WIN is free for educational andresearch purposes), Cygwin is covered by the GNU General PublicLicense (but that shouldn't matter for Perl use). The Cygwin, MKS,and U/WIN all contain (in addition to the shells) a comprehensive setof standard Unix toolkit utilities.

If you're transferring text files between Unix and Windows using FTPbe sure to transfer them in ASCII mode so the ends of lines areappropriately converted.

On Mac OS the MacPerl Application comes with a simple 32k text editorthat behaves like a rudimentary IDE. In contrast to the MacPerl Applicationthe MPW Perl tool can make use of the MPW Shell itself as an editor (withno 32k limit).

Where can I get Perl macros for vi?

For a complete version of Tom Christiansen's vi configuration file,see http://www.cpan.org/authors/Tom_Christiansen/scripts/toms.exrc.gz ,the standard benchmark file for vi emulators. The file runs best with nvi,the current version of vi out of Berkeley, which incidentally can be builtwith an embedded Perl interpreter--see http://www.cpan.org/src/misc/ .

Where can I get perl-mode or cperl-mode for emacs?

Since Emacs version 19 patchlevel 22 or so, there have been both aperl-mode.el and support for the Perl debugger built in. These shouldcome with the standard Emacs 19 distribution.

Note that the perl-mode of emacs will have fits with "main'foo"(single quote), and mess up the indentation and highlighting. Youare probably using "main::foo" in new Perl code anyway, so thisshouldn't be an issue.

For CPerlMode, see http://www.emacswiki.org/cgi-bin/wiki/CPerlMode

How can I use curses with Perl?

The Curses module from CPAN provides a dynamically loadable objectmodule interface to a curses library. A small demo can be found at thedirectory http://www.cpan.org/authors/Tom_Christiansen/scripts/rep.gz ;this program repeats a command and updates the screen as needed, renderingrep ps axu similar to top.

How can I write a GUI (X, Tk, Gtk, etc.) in Perl?

(contributed by Ben Morrow)

There are a number of modules which let you write GUIs in Perl. MostGUI toolkits have a perl interface: an incomplete list follows.

  • Tk

    This works under Unix and Windows, and the current version doesn'tlook half as bad under Windows as it used to. Some of the gui elementsstill don't 'feel' quite right, though. The interface is very naturaland 'perlish', making it easy to use in small scripts that just need asimple gui. It hasn't been updated in a while.

  • Wx

    This is a Perl binding for the cross-platform wxWidgets toolkit( http://www.wxwidgets.org ). It works under Unix, Win32 and Mac OS X,using native widgets (Gtk under Unix). The interface follows the C++interface closely, but the documentation is a little sparse for someonewho doesn't know the library, mostly just referring you to the C++documentation.

  • Gtk and Gtk2

    These are Perl bindings for the Gtk toolkit ( http://www.gtk.org ). Theinterface changed significantly between versions 1 and 2 so they haveseparate Perl modules. It runs under Unix, Win32 and Mac OS X (currentlyit requires an X server on Mac OS, but a 'native' port is underway), andthe widgets look the same on every platform: i.e., they don't match thenative widgets. As with Wx, the Perl bindings follow the C API closely,and the documentation requires you to read the C documentation tounderstand it.

  • Win32::GUI

    This provides access to most of the Win32 GUI widgets from Perl.Obviously, it only runs under Win32, and uses native widgets. The Perlinterface doesn't really follow the C interface: it's been made morePerlish, and the documentation is pretty good. More advanced stuff mayrequire familiarity with the C Win32 APIs, or reference to MSDN.

  • CamelBones

    CamelBones ( http://camelbones.sourceforge.net ) is a Perl interface toMac OS X's Cocoa GUI toolkit, and as such can be used to produce nativeGUIs on Mac OS X. It's not on CPAN, as it requires frameworks thatCPAN.pm doesn't know how to install, but installation is via thestandard OSX package installer. The Perl API is, again, very close tothe ObjC API it's wrapping, and the documentation just tells you how totranslate from one to the other.

  • Qt

    There is a Perl interface to TrollTech's Qt toolkit, but it does notappear to be maintained.

  • Athena

    Sx is an interface to the Athena widget set which comes with X, butagain it appears not to be much used nowadays.

How can I make my Perl program run faster?

The best way to do this is to come up with a better algorithm. Thiscan often make a dramatic difference. Jon Bentley's bookProgramming Pearls (that's not a misspelling!) has some good tipson optimization, too. Advice on benchmarking boils down to: benchmarkand profile to make sure you're optimizing the right part, look forbetter algorithms instead of microtuning your code, and when all elsefails consider just buying faster hardware. You will probably want toread the answer to the earlier question "How do I profile my Perlprograms?" if you haven't done so already.

A different approach is to autoload seldom-used Perl code. See theAutoSplit and AutoLoader modules in the standard distribution forthat. Or you could locate the bottleneck and think about writing justthat part in C, the way we used to take bottlenecks in C code andwrite them in assembler. Similar to rewriting in C, modules that havecritical sections can be written in C (for instance, the PDL modulefrom CPAN).

If you're currently linking your perl executable to a sharedlibc.so, you can often gain a 10-25% performance benefit byrebuilding it to link with a static libc.a instead. This will make abigger perl executable, but your Perl programs (and programmers) maythank you for it. See the INSTALL file in the source distributionfor more information.

The undump program was an ancient attempt to speed up Perl program bystoring the already-compiled form to disk. This is no longer a viableoption, as it only worked on a few architectures, and wasn't a goodsolution anyway.

How can I make my Perl program take less memory?

When it comes to time-space tradeoffs, Perl nearly always prefers tothrow memory at a problem. Scalars in Perl use more memory thanstrings in C, arrays take more than that, and hashes use even more. Whilethere's still a lot to be done, recent releases have been addressingthese issues. For example, as of 5.004, duplicate hash keys areshared amongst all hashes using them, so require no reallocation.

In some cases, using substr() or vec() to simulate arrays can behighly beneficial. For example, an array of a thousand booleans willtake at least 20,000 bytes of space, but it can be turned into one125-byte bit vector--a considerable memory savings. The standardTie::SubstrHash module can also help for certain types of datastructure. If you're working with specialist data structures(matrices, for instance) modules that implement these in C may useless memory than equivalent Perl modules.

Another thing to try is learning whether your Perl was compiled withthe system malloc or with Perl's builtin malloc. Whichever one itis, try using the other one and see whether this makes a difference.Information about malloc is in the INSTALL file in the sourcedistribution. You can find out whether you are using perl's malloc bytyping perl -V:usemymalloc.

Of course, the best way to save memory is to not do anything to wasteit in the first place. Good programming practices can go a long waytoward this:

  • Don't slurp!

    Don't read an entire file into memory if you can process it lineby line. Or more concretely, use a loop like this:

    1. #
    2. # Good Idea
    3. #
    4. while (my $line = <$file_handle>) {
    5. # ...
    6. }

    instead of this:

    1. #
    2. # Bad Idea
    3. #
    4. my @data = <$file_handle>;
    5. foreach (@data) {
    6. # ...
    7. }

    When the files you're processing are small, it doesn't much matter whichway you do it, but it makes a huge difference when they start gettinglarger.

  • Use map and grep selectively

    Remember that both map and grep expect a LIST argument, so doing this:

    1. @wanted = grep {/pattern/} <$file_handle>;

    will cause the entire file to be slurped. For large files, it's betterto loop:

    1. while (<$file_handle>) {
    2. push(@wanted, $_) if /pattern/;
    3. }
  • Avoid unnecessary quotes and stringification

    Don't quote large strings unless absolutely necessary:

    1. my $copy = "$large_string";

    makes 2 copies of $large_string (one for $copy and another for thequotes), whereas

    1. my $copy = $large_string;

    only makes one copy.

    Ditto for stringifying large arrays:

    1. {
    2. local $, = "\n";
    3. print @big_array;
    4. }

    is much more memory-efficient than either

    1. print join "\n", @big_array;

    or

    1. {
    2. local $" = "\n";
    3. print "@big_array";
    4. }
  • Pass by reference

    Pass arrays and hashes by reference, not by value. For one thing, it'sthe only way to pass multiple lists or hashes (or both) in a singlecall/return. It also avoids creating a copy of all the contents. Thisrequires some judgement, however, because any changes will be propagatedback to the original data. If you really want to mangle (er, modify) acopy, you'll have to sacrifice the memory needed to make one.

  • Tie large variables to disk

    For "big" data stores (i.e. ones that exceed available memory) considerusing one of the DB modules to store it on disk instead of in RAM. Thiswill incur a penalty in access time, but that's probably better thancausing your hard disk to thrash due to massive swapping.

Is it safe to return a reference to local or lexical data?

Yes. Perl's garbage collection system takes care of this soeverything works out right.

  1. sub makeone {
  2. my @a = ( 1 .. 10 );
  3. return \@a;
  4. }
  5. for ( 1 .. 10 ) {
  6. push @many, makeone();
  7. }
  8. print $many[4][5], "\n";
  9. print "@many\n";

How can I free an array or hash so my program shrinks?

(contributed by Michael Carman)

You usually can't. Memory allocated to lexicals (i.e. my() variables)cannot be reclaimed or reused even if they go out of scope. It isreserved in case the variables come back into scope. Memory allocatedto global variables can be reused (within your program) by usingundef() and/or delete().

On most operating systems, memory allocated to a program can never bereturned to the system. That's why long-running programs sometimes re-exec themselves. Some operating systems (notably, systems that usemmap(2) for allocating large chunks of memory) can reclaim memory thatis no longer used, but on such systems, perl must be configured andcompiled to use the OS's malloc, not perl's.

In general, memory allocation and de-allocation isn't something you canor should be worrying about much in Perl.

See also "How can I make my Perl program take less memory?"

How can I make my CGI script more efficient?

Beyond the normal measures described to make general Perl programsfaster or smaller, a CGI program has additional issues. It may be runseveral times per second. Given that each time it runs it will needto be re-compiled and will often allocate a megabyte or more of systemmemory, this can be a killer. Compiling into C isn't going to helpyou because the process start-up overhead is where the bottleneck is.

There are three popular ways to avoid this overhead. One solutioninvolves running the Apache HTTP server (available fromhttp://www.apache.org/ ) with either of the mod_perl or mod_fastcgiplugin modules.

With mod_perl and the Apache::Registry module (distributed withmod_perl), httpd will run with an embedded Perl interpreter whichpre-compiles your script and then executes it within the same addressspace without forking. The Apache extension also gives Perl access tothe internal server API, so modules written in Perl can do just aboutanything a module written in C can. For more on mod_perl, seehttp://perl.apache.org/

With the FCGI module (from CPAN) and the mod_fastcgimodule (available from http://www.fastcgi.com/ ) each of your Perlprograms becomes a permanent CGI daemon process.

Finally, Plack is a Perl module and toolkit that contains PSGI middleware,helpers and adapters to web servers, allowing you to easily deploy scripts whichcan continue running, and provides flexibility with regards to which web serveryou use. It can allow existing CGI scripts to enjoy this flexibility andperformance with minimal changes, or can be used along with modern Perl webframeworks to make writing and deploying web services with Perl a breeze.

These solutions can have far-reaching effects on your system and on the way youwrite your CGI programs, so investigate them with care.

See alsohttp://www.cpan.org/modules/by-category/15_World_Wide_Web_HTML_HTTP_CGI/ .

How can I hide the source for my Perl program?

Delete it. :-) Seriously, there are a number of (mostlyunsatisfactory) solutions with varying levels of "security".

First of all, however, you can't take away read permission, becausethe source code has to be readable in order to be compiled andinterpreted. (That doesn't mean that a CGI script's source isreadable by people on the web, though--only by people with access tothe filesystem.) So you have to leave the permissions at the sociallyfriendly 0755 level.

Some people regard this as a security problem. If your program doesinsecure things and relies on people not knowing how to exploit thoseinsecurities, it is not secure. It is often possible for someone todetermine the insecure things and exploit them without viewing thesource. Security through obscurity, the name for hiding your bugsinstead of fixing them, is little security indeed.

You can try using encryption via source filters (Starting from Perl5.8 the Filter::Simple and Filter::Util::Call modules are included inthe standard distribution), but any decent programmer will be able todecrypt it. You can try using the byte code compiler and interpreterdescribed later in perlfaq3, but the curious might still be able tode-compile it. You can try using the native-code compiler describedlater, but crackers might be able to disassemble it. These posevarying degrees of difficulty to people wanting to get at your code,but none can definitively conceal it (true of every language, not justPerl).

It is very easy to recover the source of Perl programs. You simplyfeed the program to the perl interpreter and use the modules inthe B:: hierarchy. The B::Deparse module should be able todefeat most attempts to hide source. Again, this is notunique to Perl.

If you're concerned about people profiting from your code, then thebottom line is that nothing but a restrictive license will give youlegal security. License your software and pepper it with threateningstatements like "This is unpublished proprietary software of XYZ Corp.Your access to it does not give you permission to use it blah blahblah." We are not lawyers, of course, so you should see a lawyer ifyou want to be sure your license's wording will stand up in court.

How can I compile my Perl program into byte code or C?

(contributed by brian d foy)

In general, you can't do this. There are some things that may workfor your situation though. People usually ask this questionbecause they want to distribute their works without giving awaythe source code, and most solutions trade disk space for convenience.You probably won't see much of a speed increase either, since mostsolutions simply bundle a Perl interpreter in the final product(but see How can I make my Perl program run faster?).

The Perl Archive Toolkit ( http://par.perl.org/ ) is Perl'sanalog to Java's JAR. It's freely available and on CPAN (http://search.cpan.org/dist/PAR/ ).

There are also some commercial products that may work for you, althoughyou have to buy a license for them.

The Perl Dev Kit ( http://www.activestate.com/Products/Perl_Dev_Kit/ )from ActiveState can "Turn your Perl programs into ready-to-runexecutables for HP-UX, Linux, Solaris and Windows."

Perl2Exe ( http://www.indigostar.com/perl2exe.htm ) is a command lineprogram for converting perl scripts to executable files. It targets bothWindows and Unix platforms.

How can I get #!perl to work on [MS-DOS,NT,...]?

For OS/2 just use

  1. extproc perl -S -your_switches

as the first line in *.cmd file (-S due to a bug in cmd.exe's"extproc" handling). For DOS one should first invent a correspondingbatch file and codify it in ALTERNATE_SHEBANG (see thedosish.h file in the source distribution for more information).

The Win95/NT installation, when using the ActiveState port of Perl,will modify the Registry to associate the .pl extension with theperl interpreter. If you install another port, perhaps even buildingyour own Win95/NT Perl from the standard sources by using a Windows portof gcc (e.g., with cygwin or mingw32), then you'll have to modifythe Registry yourself. In addition to associating .pl with theinterpreter, NT people can use: SET PATHEXT=%PATHEXT%;.PL to let themrun the program install-linux.pl merely by typing install-linux.

Under "Classic" MacOS, a perl program will have the appropriate Creator andType, so that double-clicking them will invoke the MacPerl application.Under Mac OS X, clickable apps can be made from any #! script using WilSanchez' DropScript utility: http://www.wsanchez.net/software/ .

IMPORTANT!: Whatever you do, PLEASE don't get frustrated, and justthrow the perl interpreter into your cgi-bin directory, in order toget your programs working for a web server. This is an EXTREMELY bigsecurity risk. Take the time to figure out how to do it correctly.

Can I write useful Perl programs on the command line?

Yes. Read perlrun for more information. Some examples follow.(These assume standard Unix shell quoting rules.)

  1. # sum first and last fields
  2. perl -lane 'print $F[0] + $F[-1]' *
  3. # identify text files
  4. perl -le 'for(@ARGV) {print if -f && -T _}' *
  5. # remove (most) comments from C program
  6. perl -0777 -pe 's{/\*.*?\*/}{}gs' foo.c
  7. # make file a month younger than today, defeating reaper daemons
  8. perl -e '$X=24*60*60; utime(time(),time() + 30 * $X,@ARGV)' *
  9. # find first unused uid
  10. perl -le '$i++ while getpwuid($i); print $i'
  11. # display reasonable manpath
  12. echo $PATH | perl -nl -072 -e '
  13. s![^/+]*$!man!&&-d&&!$s{$_}++&&push@m,$_;END{print"@m"}'

OK, the last one was actually an Obfuscated Perl Contest entry. :-)

Why don't Perl one-liners work on my DOS/Mac/VMS system?

The problem is usually that the command interpreters on those systemshave rather different ideas about quoting than the Unix shells underwhich the one-liners were created. On some systems, you may have tochange single-quotes to double ones, which you must NOT do on Unixor Plan9 systems. You might also have to change a single % to a %%.

For example:

  1. # Unix (including Mac OS X)
  2. perl -e 'print "Hello world\n"'
  3. # DOS, etc.
  4. perl -e "print \"Hello world\n\""
  5. # Mac Classic
  6. print "Hello world\n"
  7. (then Run "Myscript" or Shift-Command-R)
  8. # MPW
  9. perl -e 'print "Hello world\n"'
  10. # VMS
  11. perl -e "print ""Hello world\n"""

The problem is that none of these examples are reliable: they depend on thecommand interpreter. Under Unix, the first two often work. Under DOS,it's entirely possible that neither works. If 4DOS was the command shell,you'd probably have better luck like this:

  1. perl -e "print <Ctrl-x>"Hello world\n<Ctrl-x>""

Under the Mac, it depends which environment you are using. The MacPerlshell, or MPW, is much like Unix shells in its support for severalquoting variants, except that it makes free use of the Mac's non-ASCIIcharacters as control characters.

Using qq(), q(), and qx(), instead of "double quotes", 'singlequotes', and `backticks`, may make one-liners easier to write.

There is no general solution to all of this. It is a mess.

[Some of this answer was contributed by Kenneth Albanowski.]

Where can I learn about CGI or Web programming in Perl?

For modules, get the CGI or LWP modules from CPAN. For textbooks,see the two especially dedicated to web stuff in the question onbooks. For problems and questions related to the web, like "Whydo I get 500 Errors" or "Why doesn't it run from the browser rightwhen it runs fine on the command line", see the troubleshootingguides and references in perlfaq9 or in the CGI MetaFAQ:

  1. L<http://www.perl.org/CGI_MetaFAQ.html>

Looking in to Plack and modern Perl web frameworks is highly recommended,though; web programming in Perl has evolved a long way from the old days ofsimple CGI scripts.

Where can I learn about object-oriented Perl programming?

A good place to start is perltoot, and you can use perlobj,perlboot, perltoot, perltooc, and perlbot for reference.

A good book on OO on Perl is the "Object-Oriented Perl"by Damian Conway from Manning Publications, or "Intermediate Perl"by Randal Schwartz, brian d foy, and Tom Phoenix from O'Reilly Media.

Where can I learn about linking C with Perl?

If you want to call C from Perl, start with perlxstut,moving on to perlxs, xsubpp, and perlguts. If you want tocall Perl from C, then read perlembed, perlcall, andperlguts. Don't forget that you can learn a lot from looking athow the authors of existing extension modules wrote their code andsolved their problems.

You might not need all the power of XS. The Inline::C module letsyou put C code directly in your Perl source. It handles all themagic to make it work. You still have to learn at least some ofthe perl API but you won't have to deal with the complexity of theXS support files.

I've read perlembed, perlguts, etc., but I can't embed perl in my C program; what am I doing wrong?

Download the ExtUtils::Embed kit from CPAN and run `make test'. Ifthe tests pass, read the pods again and again and again. If theyfail, see perlbug and send a bug report with the output ofmake test TEST_VERBOSE=1 along with perl -V.

When I tried to run my script, I got this message. What does it mean?

A complete list of Perl's error messages and warnings with explanatorytext can be found in perldiag. You can also use the splain program(distributed with Perl) to explain the error messages:

  1. perl program 2>diag.out
  2. splain [-v] [-p] diag.out

or change your program to explain the messages for you:

  1. use diagnostics;

or

  1. use diagnostics -verbose;

What's MakeMaker?

(contributed by brian d foy)

The ExtUtils::MakeMaker module, better known simply as "MakeMaker",turns a Perl script, typically called Makefile.PL, into a Makefile.The Unix tool make uses this file to manage dependencies and actionsto process and install a Perl distribution.

AUTHOR AND COPYRIGHT

Copyright (c) 1997-2010 Tom Christiansen, Nathan Torkington, andother authors as noted. All rights reserved.

This documentation is free; you can redistribute it and/or modify itunder the same terms as Perl itself.

Irrespective of its distribution, all code examples here are in the publicdomain. You are permitted and encouraged to use this code and anyderivatives thereof in your own programs for fun or for profit as yousee fit. A simple comment in the code giving credit to the FAQ wouldbe courteous but is not required.

Source : perldoc.perl.org - Official documentation for the Perl programming language
Site maintained by Jon Allen (JJ)     See the project page for more details
Documentation maintained by the Perl 5 Porters
(Sebelumnya) Obtaining and Learning about PerlData Manipulation (Berikutnya)