|
|
(58 intermediate revisions not shown.) |
Line 1: |
Line 1: |
- | {{otheruses}}
| + | '''<center>'''PERL''' - Practical Extraction and Report Language</center>''' |
- | {{Infobox programming language
| + | |
- | | name = Perl
| + | |
- | | logo = [[Image:Programming-republic-of-perl.png]]
| + | |
- | | paradigm = [[Multi-paradigm]]
| + | |
- | | year = 1987
| + | |
- | | designer = [[Larry Wall]]
| + | |
- | | latest_release_version = 5.10.0
| + | |
- | | latest_release_date = {{release date|2007|12|18}}
| + | |
- | | turing-complete = Yes
| + | |
- | | typing = Dynamic
| + | |
- | | influenced_by = [[AWK (programming language)|AWK]], [[BASIC]], [[BASIC-PLUS]], [[C (programming language)|C]], [[C++]], [[Lisp (programming language)|Lisp]], [[Pascal (programming language)|Pascal]], [[sed]], [[Unix shell]]
| + | |
- | | influenced = [[Python (programming language)|Python]], [[PHP]], [[Ruby (programming language)|Ruby]], [[ECMAScript]], [[Dao (programming language)|Dao]], [[Windows PowerShell]]
| + | |
- | | operating_system = [[Cross-platform]]
| + | |
- | | license = [[GNU General Public License]], [[Artistic License]]
| + | |
- | | website = http://www.perl.org/
| + | |
- | }}
| + | |
- | <!-- "Perl" is not an acronym (read the "Name" section below); do not put that here. -->
| + | |
| | | |
- | In computer programming, '''Perl''' is a [[high-level programming language|high-level]], [[List of programming languages by category|general-purpose]], [[Interpreter (computing)|interpreted]], [[dynamic programming language]]. Perl was originally developed by [[Larry Wall]], a [[Linguistics|linguist]] working as a [[systems administrator]] for [[NASA]], in 1987, as a general purpose [[Unix]] scripting language to make report processing easier.<ref>[http://perl.about.com/od/gettingstartedwithperl/p/whatisperl.htm What is Perl?<!-- Bot generated title -->]</ref><ref>[http://www.perl.com/pub/a/2000/10/begperl1.html perl.com: Beginner's Introduction to Perl<!-- Bot generated title -->]</ref> Since then, it has undergone many changes and revisions and became widely popular among programmers. Larry Wall continues to oversee development of the core language, and its newest version, Perl 6.
| |
| | | |
- | Perl borrows features from other programming languages including [[C (programming language)|C]], [[shell script]]ing ([[Bourne shell|sh]]), [[AWK (programming language)|AWK]], [[sed]] and [[Lisp (programming language)|Lisp]].<ref name="perltimeline">{{cite web | url=http://history.perl.org/PerlTimeline.html | title=The Timeline of Perl and its Culture (v3.0_0505) | author=Ashton, Elaine | year=1999}}</ref> The language provides powerful text processing facilities without arbitrary data length limits, like the many Unix tools present at the time, <ref name="programmingperl">{{cite book | title=Programming Perl, Third Edition | author=[[Larry Wall|Wall, Larry]], [[Tom Christiansen]] and [[Jon Orwant]] | publisher=O'Reilly | month=July | year=2000 | ISBN=0-596-00027-8}}</ref><!--Ref is from the forward of that book --> making it the ideal language for manipulating [[text file]]s. It is also used for [[graphics|graphics programming]], [[System administrator|system administration]], [[computer network programming|network programming]], [[database| applications that require database access]] and [[Common Gateway Interface|CGI programming]] on the [[World Wide Web|Web]]. Perl is nicknamed as the [[Swiss Army knife|Swiss Army knife]] of the programming languages because of its flexibility and adaptability.<ref> {{cite web|url=http://www.perl.com/pub/a/2000/10/begperl1.html |title=Beginner's Introduction to Perl |accessdate=2008-07-27 |last=Sheppard |first=Doug |date=2000-10-16 |publisher=[[O'Reilly Media]] }}</ref>
| + | A server side-scripting language (programs gets executed on server side) developed in 1986 by Larry Wall, the UNIX based language has evolved into a powerful tool for the internet. It was designed as a quick-fix patch program for UNIX based systems. The language is very simplistic, offering optimum flexibility, perfect for short, straightforward scripting. |
| | | |
- | == History ==
| + | Since then its popularity has increased due to its flexibility, portability, usefulness, and its varied features. To get started, load a simple text editor program and follow along in our examples. |
- | [[Larry Wall]] began work on Perl in 1987, while working as a programmer at [[Unisys]],<ref name="larry-wall-snippet">{{cite web|title=Larry Wall|url=http://www.perl.com/pub/au/Wall_Larry|accessdate=2006-08-20}}</ref> and released version 1.0 to the comp.sources.misc [[newsgroup]] on December 18, 1987.<ref>{{cite web|title=Perl, a "replacement" for awk and sed|url=http://groups.google.com/group/comp.sources.unix/browse_thread/thread/363c7a6fa4e2668b/bb3ee125385ae25f|accessdate=2007-12-18}}</ref> The language expanded rapidly over the next few years. Perl 2, released in 1988, featured a better [[regular expression]] engine. Perl 3, released in 1989, added support for [[binary data]] streams.
| + | |
| | | |
- | Originally the only documentation for Perl was a single (increasingly lengthy) [[Manual page (Unix)|man page]]. In 1991, ''[[Programming perl]]'' <!-- 1st edition title used lowercase "perl" --> (known to many Perl programmers as the "Camel Book") was published, and became the ''de facto'' reference for the language. At the same time, the Perl version number was bumped to 4, not to mark a major change in the language, but to identify the version that was documented by the book.
| + | ==Getting Started== |
| + | First things first, you must have latest version of PERL installed on your web hosting machine available for download via Perl.com, just follow the download links. They also offer installation help for a wide variety of operating systems. We suggest you direct any installation help to the experts there. |
| | | |
- | Perl 4 went through a series of maintenance releases, culminating in Perl 4.036 in 1993. At that point, Wall abandoned Perl 4 to begin work on Perl 5.
| + | This page will be web based, working with and creating files over the internet. File management is the bread and butter of the PERL language, and as you will discover, it's absolutely perfect for doing so. |
| | | |
- | Initial design of Perl 5 continued into 1994. ''The perl5-porters'' [[mailing list]] was established in May 1994 to coordinate work on porting Perl 5 to different platforms. It remains the primary forum for development, maintenance, and porting of Perl 5.<ref>[http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/ `perl5-porters' Mailing List Archive<!-- Bot generated title -->]</ref>
| + | ===File Extension=== |
| + | A PERL script can be created inside of any normal simple-text editor program. There are several programs available for every type of platform. There are many programs designed for programmers available for download on the web. |
| | | |
- | Perl 5 was released on October 17, 1994. It was a nearly complete rewrite of the [[interpreter (computing)|interpreter]], and added many new features to the language, including objects, references, [[Local variable|lexical (my) variables]], and modules. Importantly, modules provided a mechanism for extending the language without modifying the interpreter. This allowed the core interpreter to stabilize, even as it enabled ordinary Perl programmers to add new language features.
| + | Regardless of the program you choose to use, a PERL file must be saved with a .pl (.PL) file extension in order to be recognized as a functioning PERL script. File names can contain numbers, symbols, and letters but must not contain a space. Use an underscore (_) in places of spaces. |
| | | |
- | As of 2008, Perl 5 is still being actively maintained. Important features and some essential new language constructs have been added along the way, including [[Unicode]] support, [[Thread (computer science)|threads]], improved support for [[object oriented programming]] and many other enhancements.
| + | ==First Script== |
| + | With PERL installed we are ready to dive into our first script. There are a few elements every PERL script must contain in order to function. Open up your favorite simple text editor, the file extension for PERL scripts is .pl. Save your files with this extension. |
| + | The first line of every PERL script is a commented line directed toward the PERL interpreter. This line is generally the same from one instal of PERL to the next, it might look something like this: |
| | | |
- | On December 18, 2007, the 20th anniversary of Perl 1.0, Perl 5.10.0 was released. Perl 5.10.0 includes notable new features, which bring it closer to [[Perl 6]], among them a new [[switch statement]] (called "given/when"), regular expressions updates, the "smart match operator" ~~, and more.<ref>[http://search.cpan.org/~rgarcia/perl-5.10.0-RC2/pod/perl5100delta.pod perldelta—what is new for perl 5.10.0]</ref>
| + | '''firstscript.pl''' |
| | | |
- | One of the most important events in Perl 5 history took place outside of the language proper, and was a consequence of its module support. On [[October 26]], [[1995]], the [[Comprehensive Perl Archive Network]] (CPAN) was established as a [[repository]] for Perl [[Module (programming)|modules]] and Perl itself. At the time of writing, it carries over 13,500 modules by over 6,500 authors. CPAN is widely regarded as one of the greatest strengths of Perl in practice.
| + | <nowiki>#!/usr/bin/perl</nowiki> |
| | | |
- | === Name ===
| + | The comment points to the installation path of PERL, usually /usr/bin/perl. If not, you can locate the directory tree to PERL somewhere in the documentation of your web server, or email your web host and they can specify your PERL installation directory. |
- | Perl was originally named "Pearl", after the [[Parable of the Pearl]] from the [[Gospel of Matthew]]. Larry Wall wanted to give the language a short name with positive connotations; he claims that he considered (and rejected) every three- and four-letter word in the dictionary. He also considered naming it after his wife Gloria. Wall discovered the existing [[PEARL (programming language)|PEARL]] programming language before Perl's official release and changed the spelling of the name.
| + | |
| | | |
- | The name is normally capitalized (''Perl'') when referring to the language and uncapitalized (''perl'') when referring to the interpreter program itself since Unix-like file systems are case-sensitive. Before the release of the first edition of ''Programming Perl'', it was common to refer to the language as ''perl''; [[Randal L. Schwartz]], however, capitalised the language's name in the book to make it stand out better when typeset. The case distinction was subsequently adopted by the community.<ref>{{cite web | url=http://perldoc.perl.org/perlfaq1.html#What's-the-difference-between-%22perl%22-and-%22Perl%22%3f | title=perlfaq1: What's the difference between "perl" and "Perl"?}}</ref>
| + | ==HTTP Headers== |
| + | Because we are working in a web environment we are sort of jumping ahead of the game. We have to introduce some HTTP headers so that PERL understands we are working with a web browser. To do this we have to run another line of strange code called an HTTP header as you may have guessed. It looks something like this: |
| | | |
- | The name is occasionally given as "PERL" (for ''Practical Extraction and Report Language''). Although the expansion has prevailed in many of today's manuals, including the official Perl [[Manual page (Unix)|man page]], it is merely a [[backronym]]. The name does not officially stand for anything, so spelling it in all caps is incorrect. Proper capitalisation is considered a [[shibboleth]] in the Perl community.<ref>{{cite web | last = Schwartz | first = Randal | authorlink = Randal L. Schwartz | title = PERL as shibboleth and the Perl community | url=http://www.perlmonks.org/index.pl?node_id=510594 | accessdate = 2007-06-01 }}</ref> Several other expansions have been suggested, including Wall's own humorous ''Pathologically Eclectic Rubbish Lister''.<ref>{{ cite web | last = Wall | first = Larry | authorlink = Larry Wall | title = BUGS | work = perl(1) [[man page]] | url = http://perldoc.perl.org/perl.html#BUGS | accessdate = 2006-10-13 }}</ref> Indeed, Wall claims that the name was intended to inspire many different expansions.<ref>{{cite web | last = Wall | first = Larry | authorlink = Larry Wall | title = Re^7: PERL as shibboleth and the Perl community | url =http://www.perlmonks.org/index.pl?node_id=511722 | accessdate = 2007-01-03 }}</ref>
| + | <nowiki>#!/usr/bin/perl</nowiki> |
| | | |
- | === The camel symbol ===
| + | print "content-type: text/html \n\n"; |
- | ''[[Programming Perl]]'', published by [[O'Reilly Media]], features a picture of a [[camel]] on the cover, and is commonly referred to as ''The Camel Book''.<ref name="larry-wall-snippet"/> This image of a camel has become a general symbol of Perl.
| + | |
| | | |
- | It is also a [[Hacker (computing)|hacker]] [[Hacker Emblem|emblem]], appearing on some [[T-shirt]]s and other clothing items.
| + | At this point our script still has no real functionality, all we have done thus far is locate our PERL interpreter and tell it that we are going to be working with a web browser or in a web environment. |
| | | |
- | O'Reilly owns the image as a trademark, but claims to use their legal rights only to protect the ''"integrity and impact of that symbol"''.<ref>[http://perl.oreilly.com/usage/ O'Reilly—The Perl Camel Usage and Trademark Information<!-- Bot generated title -->]</ref>
| + | == Hello, PERL! Script== |
- | O'Reilly allows non-commercial use of the symbol, and provides ''Programming Republic of Perl'' logos and ''Powered by Perl'' buttons.<ref>[http://www.oreillynet.com/images/perl/ Index of /images/perl<!-- Bot generated title -->]</ref>
| + | |
| | | |
- | == Overview ==
| + | Now that we have located the interpreter and told PERL we are working with the web, we can print text to the browser using print function. |
- | Perl is a general-purpose programming language originally developed for text manipulation and now used for a wide range of tasks including [[system administration]], [[web development]], [[Computer network programming|network programming]], [[GUI]] development, and more.
| + | |
| | | |
- | The language is intended to be practical (easy to use, efficient, complete) rather than beautiful (tiny, elegant, minimal).<ref>perlintro(1) [[man page]]</ref> Its major features include support for multiple programming paradigms ([[procedural programming language|procedural]], [[Object-oriented programming|object-oriented]], and [[functional programming|functional]] styles), [[reference counting]] [[memory management]] (without a cycle-detecting garbage collector), built-in support for text processing, and a large collection of third-party [[Module (programming)|modules]].
| + | <nowiki>#!/usr/bin/perl</nowiki> |
| | | |
- | According to Larry Wall, Perl has two slogans. The first is "There's more than one way to do it", commonly known as TMTOWTDI and the second is "Easy things should be easy and hard things should be possible".<ref>[http://www.techweb.com/wire/story/TWB19980408S0020-Q&A With Larry Wall, Creator Of Perl]</ref>
| + | print "content-type: text/html \n\n"; |
| | | |
- | === Features ===
| + | print "Hello, PERL!"; |
- | The overall structure of Perl derives broadly from C. Perl is procedural in nature, with [[variable]]s, [[expression (programming)|expressions]], [[assignment statement]]s, [[bracket|brace]]-delimited [[code block]]s, [[control structure]]s, and [[subroutine]]s.
| + | |
| | | |
- | Perl also takes features from shell programming. All variables are marked with leading [[sigil (computer programming)|sigils]], which unambiguously identify the data type (scalar, array, hash, etc.) of the variable in context. Importantly, sigils allow variables to be interpolated directly into strings. Perl has many built-in functions which provide tools often used in shell programming (though many of these tools are implemented by programs external to the shell) like sorting, and calling on system facilities.
| + | You should see "Hello, PERL!" in the top left corner of your browser, pretty simple and straightforward. |
| | | |
- | Perl takes [[List (computing)|lists]] from Lisp, [[associative array]]s (hashes) from AWK, and [[regular expression]]s from sed. These simplify and facilitate many parsing, text handling, and data management tasks.
| + | ===Execute Your First Script=== |
| + | Now it is time to upload your firstscript.pl to your web server and execute it. After you upload your file be sure to CHMOD the script file and allow anonymous execution priviledge, generally a setting of 755 works perfectly. |
| | | |
- | In Perl 5, features were added that support complex [[data structure]]s, [[first-class function]]s (i.e., [[Closure (computer science)|closures]] as values), and an object-oriented programming model. These include [[reference (computer science)|references]], packages, class-based method dispatch, and [[Scope (programming)|lexically scoped variables]], along with [[compiler directive]]s (for example, the <tt>strict</tt> pragma). A major additional feature introduced with Perl 5 was the ability to package code as reusable modules. Larry Wall later stated that "The whole intent of Perl 5' s module system was to encourage the growth of Perl culture rather than the Perl core."<ref>Usenet post, May 10th 1997, with ID [email protected]. </ref> | + | You script is working perfectly if you are staring at a blank screen and didn't recieve a 500 or 404 error message. |
| | | |
- | All versions of Perl do automatic data typing and memory management. The interpreter knows the type and storage requirements of every data object in the program; it allocates and frees storage for them as necessary using [[reference counting]] (so it cannot deallocate circular data structures without manual intervention). Legal type conversions—for example, conversions from number to string—are done automatically at run time; illegal type conversions are fatal errors.
| + | ===Debugging Your Script(s)=== |
| + | If you are using an FTP program to upload your scripts, set the upload type to ASCII or "Text". This setting prevents the mysterious addition of random characters that sometimes happens when copying files across different operating systems. Learning to do this prevents hours of headaches and frustration. |
| | | |
- | === Design ===
| + | Another great debugging technique is to isolate the code you are currently working on. To do this you can temporarily comment out lines of code to isolate only the section that is returning an error message. |
- | The design of Perl can be understood as a response to three broad trends in the computer industry: falling hardware costs, rising labor costs, and improvements in compiler technology. Many earlier computer languages, such as [[Fortran]] and C, were designed to make efficient use of expensive computer hardware. In contrast, Perl is designed to make efficient use of expensive computer programmers.
| + | |
| | | |
- | Perl has many features that ease the programmer's task at the expense of greater CPU and memory requirements. These include automatic memory management; [[dynamic typing]]; strings, lists, and hashes; regular expressions; introspection and an <tt>eval()</tt> function.
| + | ===Syntax=== |
| + | PERL follows a very specific syntax not unlike other programming languages. It is important to develop good syntax habits as it will save you from having to debug things later, not to mention save yourself from eye strain and mind numbing headaches. |
| | | |
- | Wall was trained as a linguist, and the design of Perl is very much informed by linguistic principles. Examples include [[Huffman coding]] (common constructions should be short), good end-weighting (the important information should come first), and a large collection of language primitives. Perl favors language constructs that are concise and natural for humans to read and write, even where they complicate the Perl interpreter.
| + | === Case Sensitivity=== |
| + | File names, variables, and arrays are all case sensitive. If you capitalize a variable name when you define it, you must capitalize it to call it. |
| | | |
- | Perl syntax reflects the idea that "things that are different should look different". For example, scalars, arrays, and hashes have different leading [[Sigil (computer programming)|sigils]]. Array indices and hash keys use different kinds of braces. Strings and regular expressions have different standard delimiters. This approach can be contrasted with languages like [[Lisp programming language|Lisp]], where the same [[S-expression]] construct and basic syntax is used for many different purposes.
| + | A great tip for large scripts containing a vast number of variable names it is best to be consistent with your case sensitivity and maybe even develop a system for naming variables that makes sense to you. For the majority of us programmers, capitals are simply not an option. |
| | | |
- | Perl does not enforce any particular programming paradigm (procedural, object-oriented, functional, etc.) or even require the programmer to choose among them.
| + | $VAriaBLE_NAmES = "string"; |
| | | |
- | There is a broad practical bent to both the Perl language and the community and culture that surround it. The preface to ''Programming Perl'' begins, "Perl is a language for getting your job done." One consequence of this is that Perl is not a tidy language. It includes many features, tolerates exceptions to its rules, and employs heuristics to resolve syntactical ambiguities. Because of the forgiving nature of the compiler, bugs can sometimes be hard to find. Discussing the variant behaviour of built-in functions in list and scalar contexts, the perlfunc(1) manual page says "In general, they do what you want, unless you want consistency."
| + | $LIKe_tHESE = "Another String"; |
| | | |
- | Perl has several mottos that convey aspects of its design and use. One is ''"[[There's more than one way to do it]]."'' (TIMTOWTDI, usually pronounced 'Tim Toady'). Others are ''"Perl: the Swiss Army Chainsaw of Programming Languages"'' and ''"No unnecessary limits"''. A stated design goal of Perl is to make easy tasks easy and difficult tasks possible. Perl has also been called ''"The Duct Tape of the Internet"''.<ref>{{cite web | url = http://www.oreillynet.com/pub/a/oreilly/perl/news/importance_0498.html | title = The Importance of Perl | year = 1998 | month = April | publisher = O'Reilly & Associates, Inc. | quote = As Hassan Schroeder, Sun's first webmaster, remarked: “Perl is the duct tape of the Internet.” }}</ref>
| + | $ARe_HArd_to_Type = "A Third String"; |
| | | |
- | There is no written specification or standard for the Perl language, and no plans to create one for the current version of Perl. There has only been one implementation of the interpreter. That interpreter, together with its functional tests, stands as a ''de facto'' specification of the language.
| + | ===Comments=== |
| + | As with any programming language, PERL offers an escape from your code via the '#' sign. Any words, spaces, or marks after a pound symbol will be ignored by the program interpreter, offering you the coder, a chance to place reminders to yourself about your code. It's a great way to note specifics of your code to yourself or others viewing your code/script. Comments are necessary for any script you wish to publish to others or make readily available. |
| + | PERL Comment: |
| | | |
- | === Applications ===
| + | <nowiki>#!/usr/bin/perl</nowiki> |
- | Perl has many and varied applications, compounded by the availability of many standard and third-party modules.
| + | |
| | | |
- | Perl has been used since the early days of the Web to write [[Common Gateway Interface|CGI]] scripts. It is known as one of "the three Ps" (along with [[Python (programming language)|Python]] and [[PHP]]), the most popular dynamic languages for writing Web applications. It is also an integral component of the popular [[LAMP (software bundle)|LAMP]] [[solution stack]] for web development. Large projects written in Perl include [[Slash (weblog system)|Slash]], [[Bugzilla]], [[TWiki]] and [[Movable Type]]. Many high-traffic websites, such as [[bbc.co.uk]], [[Amazon.com]], [[LiveJournal]], [[Ticketmaster]] and [[Internet Movie Database|IMDb]]<ref>{{cite web | title = IMDb Helpdesk: What software/hardware are you using to run the site? | url = http://www.imdb.com/help/search?domain=helpdesk_faq&index=1&file=techinfo | accessdate = 2007-09-01 }}</ref> use Perl extensively.
| + | print "Content-type: text/html \n\n"; # the header |
| | | |
- | Perl is often used as a [[glue language]], tying together systems and interfaces that were not specifically designed to interoperate, and for "data munging", i.e., converting or processing large amounts of data for tasks like creating reports. In fact, these strengths are intimately linked. The combination makes perl a popular all-purpose tool for [[system administrator]]s, particularly as short programs can be entered and run on a single command line.
| + | <nowiki>#Comments start with a #</nowiki> |
| | | |
- | With a degree of care, Perl code can be made portable across Windows and Unix. Portable Perl code is often used by suppliers of software (both COTS and bespoke) to simplify packaging and maintenance of software build and deployment scripts.
| + | This comment is extreme and overdone, you might see more comments like this in scripts that are offered free on the internet. Often programmers will include a large commented section as an installation or set-up guide included right there in the script itself. |
| | | |
- | Graphical user interfaces (GUI's) may be developed using Perl. In particular, Perl/Tk is commonly used to enable user interaction with Perl scripts. Such interaction may be synchronous or asynchronous using callbacks to update the GUI. For more information about the technologies involved see [[Tk (computing)|Tk]],[[Tcl]] and [[WxPerl]].
| + | ===Escaping Characters=== |
| + | In PERL we use the backslash (\) character to escape any type of character that might interfere with our code. For example there may become a time when you would like to print a dollar sign rather than use one to define a variable. To do this you must "escape" the character using a backslash (\). |
| | | |
- | Perl is also widely used in finance and [[bioinformatics]], where it is valued for rapid application development and deployment, and the ability to handle large data sets.
| + | $string = "David paid \$4.34 for Larry\'s shirt."; |
| | | |
- | === Implementation === | + | $email = "youremail\@youremail.com"; |
- | Perl is implemented as a core interpreter, written in C, together with a large collection of modules, written in Perl and C. The source distribution is, [[as of 2005]], 12 [[megabyte|MB]] when packaged in a [[Tar (file format)|tar file]] and [[data compression|compressed]]. The interpreter is 150,000 lines of C code and compiles to a 1 MB executable on typical machine architectures. Alternatively, the interpreter can be compiled to a link library and embedded in other programs. There are nearly 500 modules in the distribution, comprising 200,000 lines of Perl and an additional 350,000 lines of C code. (Much of the C code in the modules consists of character encoding tables.)
| + | |
| | | |
- | The interpreter has an object-oriented architecture. All of the elements of the Perl language—scalars, arrays, hashes, coderefs, file handles—are represented in the interpreter by C structs. Operations on these structs are defined by a large collection of macros, typedefs and functions; these constitute the Perl C API. The Perl API can be bewildering to the uninitiated, but its entry points follow a consistent naming scheme, which provides guidance to those who use it.
| + | print "$string"; |
| | | |
- | The execution of a Perl program divides broadly into two phases: compile-time and run-time.<ref>A description of the Perl 5 interpreter can be found in ''Programming Perl'', 3rd Ed., [http://www.oreilly.com/catalog/pperl3/chapter/ch18.html chapter 18]</ref> At compile time, the interpreter parses the program text into a syntax tree. At run time, it executes the program by walking the tree. The text is parsed only once, and the syntax tree is subject to optimization before it is executed, so the execution phase is relatively efficient. Compile-time optimizations on the syntax tree include [[constant folding]] and context propagation, but [[peephole optimization]] is also performed. However, compile-time and run-time phases may nest: <code>BEGIN</code> code blocks execute at compile-time, while the <code>[[eval]]</code> function initiates compilation during runtime. Both operations are an implicit part of a number of others—most notably, the <code>use</code> clause that loads libraries, known in Perl as modules, implies a <code>BEGIN</code> block.
| + | print "$email"; |
| | | |
- | Perl has a context-sensitive [[grammar]] which can be affected by code executed during an intermittent run-time phase.<ref>{{cite web | last = Schwartz | first = Randal | authorlink = Randal L. Schwartz | title = On Parsing Perl | url =http://www.perlmonks.org/index.pl?node_id=44722 | accessdate = 2007-01-03 }}</ref> Therefore Perl cannot be parsed by a straight [[Lex programming tool|Lex]]/[[Yacc]] lexer/parser combination. Instead, the interpreter implements its own lexer, which coordinates with a modified [[GNU bison]] parser to resolve ambiguities in the language. It is said that "only perl can parse Perl", meaning that only the [[Perl interpreter]] (''perl'') can parse the Perl language (''Perl''). The truth of this is attested to by the persistent imperfections of other programs that undertake to parse Perl, such as source code analyzers and auto-indenters, which have to contend not only with the many ways to express unambiguous syntactic constructs, but also the fact that Perl cannot be parsed in the general case without executing it. Though successful in creating a Perl parser for document-related purposes, the PPI project determined that parsing Perl code as a document (retaining its integrity) and as executable code simultaneously was, in fact, not possible. Specifically the author claimed that, "parsing Perl suffers from the '[[Halting problem|Halting Problem]].'"<ref>{{cite web | url=http://search.cpan.org/~adamk/PPI-1.201/lib/PPI.pm | title=PPI—Parse, Analyze and Manipulate Perl (without perl) | author=Kennedy, Adam | year=2006 | publisher=[[CPAN]]}}</ref>
| + | David paid $4.34 for Larry's shirt. |
| | | |
- | Perl is distributed with some 120,000 functional tests. These run as part of the normal build process, and extensively exercise the interpreter and its core modules. Perl developers rely on the functional tests to ensure that changes to the interpreter do not introduce bugs; conversely, Perl users who see the interpreter pass its functional tests on their system can have a high degree of confidence that it is working properly.
| + | youremail@youremail.com |
| | | |
- | Maintenance of the Perl interpreter has become increasingly difficult over the years. The code base has been in continuous development since 1994. The code has been optimized for performance at the expense of simplicity, clarity, and strong internal interfaces. New features have been added, yet virtually complete backward compatibility with earlier versions is maintained. The size and complexity of the interpreter is a barrier to developers who wish to work on it.
| + | ==Define Some Variables== |
| + | A variable is defined by the ($) symbol (scalar), the (@) symbol (arrays), or the (%) symbol (hashes). |
| | | |
- | === Availability ===
| + | <nowiki>#!/usr/bin/perl</nowiki> |
- | <!--Note to editors: | + | |
- | Perl is available on so many platforms that it doesn't make sense to keep a laundry list in this article.
| + | |
- | Do not list a specific platform unless there are notable issues about running Perl on it.
| + | |
| | | |
- | -->Perl is [[free software]], and is licensed under both the [[Artistic License]] and the [[GNU General Public License]]. Distributions are available for most [[operating system]]s. It is particularly prevalent on [[Unix]] and [[Unix-like]] systems, but it has been ported to most modern (and many obsolete) platforms. With only six reported exceptions, Perl can be compiled from [[source code]] on all Unix-like, [[POSIX]]-compliant or otherwise Unix-compatible platforms.<ref name="cpanports">{{cite web | url=http://www.cpan.org/ports/ | title=Perl Ports (Binary Distributions) | publisher=CPAN.org | author=Hietaniemi, Jarkko | year=1998}}</ref> However, this is rarely necessary, as Perl is included in the default installation of many popular operating systems. | + | print "Content-type: text/html \n\n"; #HTTP HEADER |
| | | |
- | Because of unusual changes required for the [[Mac OS history|Mac OS Classic]] environment, a special port called MacPerl was shipped independently.<ref name="macperl">{{cite web | url=http://www.macperl.com/ | title=The MacPerl Pages | year=1997 | publisher=Prime Time Freeware}}</ref>
| + | $myname = "some_value"; |
| | | |
- | The CPAN carries a complete list of supported platforms with links to the distributions available on each.<ref>[http://www.cpan.org/ports/ CPAN/ports<!-- Bot generated title -->]</ref>
| + | @array = ("value00","value01","value02"); |
| | | |
- | ==== Windows ==== | + | %hash = ("Quarter", 25, "Dime", 10, "Nickle", 5); |
| | | |
- | Users of [[Microsoft Windows]] typically install one of the native binary distributions of Perl for Win32<ref>{{cite web | url=http://win32.perl.org/wiki/index.php?title=Win32_Distributions#Perl_Distributions | title=Win32 Distributions | publisher=Win32 Perl Wiki}}</ref>, most commonly [[ActivePerl]]. Compiling Perl from [[source code]] under Windows is possible, but most installations lack the requisite C compiler and build tools. This also makes it hard to install modules from the CPAN, particularly those that are partially written in C.
| + | -- OR -- |
| | | |
- | Users of the ActivePerl binary distribution are therefore dependent on the repackaged modules provided in [[ActiveState]]’s module repository, which are precompiled and can be installed with [[Perl package manager|PPM]]. Limited resources to maintain this repository have been cause for various long-standing problems.<ref>{{cite web | url= http://www.mail-archive.com/[email protected]/msg05407.html | title=Activestate and Scalar-List-Utils | author=Golden, David | year=2006}}</ref><ref>{{cite web | url=http://use.perl.org/~Alias/journal/35219 | title=ActivePerl PPM repository design flaw goes critical | author=Kennedy, Adam | year=2007}}</ref> | + | my $myname = "some string"; |
| | | |
- | To address this and other problems of Perl on the Windows platform, [http://win32.perl.org/ win32.perl.org] was launched by Adam Kennedy on behalf of [[The Perl Foundation]] in June 2006. This is a community website for "all things Windows and Perl." A major aim of this project is to provide production-quality alternative Perl distributions that include an embedded C compiler and build tools, so as to enable Windows users to install modules directly from the CPAN. The production distribution in the family is known as [http://strawberryperl.com/ Strawberry Perl], with research and experimental work done in a related [http://vanillaperl.com/ Vanilla Perl] distribution.
| + | my @array = ("value00", "value01", "value02"); |
| | | |
- | Another popular way of running Perl under Windows is provided by the [[Cygwin]] emulation layer. Cygwin provides a Unix-like environment on Windows and both perl and cpan are conveniently available as standard pre-compiled packages in the Cygwin setup program. Since Cygwin also includes the [[GNU Compiler Collection|gcc]], compiling Perl from source is also possible.
| + | The latter example using the my parameter is another means to define a variable that you might run across as you gain more experience. It is not necessary to use the my parameter. Variables can be defined either way. |
| | | |
- | == Language structure == | + | ===Scalar Variables=== |
- | In Perl, the minimal [[Hello world]] program may be written as follows:
| + | |
- | <source lang="perl">
| + | |
- | print "Hello, world!\n"
| + | |
- | </source>
| + | |
- | This [[Input/output|prints]] the [[String (computer science)|string]] ''Hello, world!'' and a [[newline]], symbolically expressed by an <code>n</code> character whose interpretation is altered by the preceding [[escape character]] (a backslash).
| + | |
| | | |
- | The canonical form of the program is slightly more verbose: | + | Scalar variables are simple variables containing only one element--a string, a number, or a reference. Strings may contain any symbol, letter, or number. Numbers may contain exponents, integers, or decimal values. The bottom line here with scalar variables is that they contain only one single piece of data. What you see is what you get with scalar variables. |
| | | |
- | <source lang="perl">
| + | $number = "5"; |
- | #!/usr/bin/perl
| + | |
- | print "Hello, world!\n";
| + | |
- | </source>
| + | |
| | | |
- | The hash mark character introduces a [[comment (computer programming)|comment]] in Perl, which runs up to the end of the line of code and is ignored by the compiler. The comment used here is of a special kind: it’s called the [[Shebang (Unix)|shebang]] line. This tells Unix-like operating systems where to find the Perl interpreter, making it possible to invoke the program without explicitly mentioning <code>perl</code>. (Note that on [[Microsoft Windows]] systems, Perl programs are typically invoked by associating the <code>.pl</code> [[Filename extension|extension]] with the Perl interpreter. In order to deal with such circumstances, <code>perl</code> detects the shebang line and parses it for switches,<ref name="perlrun">{{cite web | url=http://perldoc.perl.org/perlrun.html#DESCRIPTION | title=perlrun manpage}}</ref> so it is not strictly true that the shebang line is ignored by the compiler.)
| + | $exponent = "2 ** 8"; |
| | | |
- | The second line in the canonical form includes a semicolon, which is used to separate statements in Perl. With only a single statement in a block or file, a separator is unnecessary, so it can be omitted from the minimal form of the program—or more generally from the final statement in any block or file. The canonical form includes it because it is common to terminate every statement even when it is unnecessary to do so, as this makes editing easier: code can be added to or moved away from the end of a block or file without having to adjust semicolons.
| + | $string = "Hello, PERL!"; |
| | | |
- | Version 5.10 of Perl introduces a <code>say</code> function that implicitly appends a newline character to its output, making the minimal "Hello world" program even shorter:
| + | $stringpart_1 = "Hello, "; |
| | | |
- | <source lang="perl">
| + | $stringpart_2 = "PERL!"; |
- | say 'Hello, world!'
| + | |
- | </source>
| + | |
| | | |
- | === Data types ===
| + | Scalars are very straight forward. Notice that we used a period (.) between each of our variables. This is a special kind of operator that concatenates two or more variables. |
- | Perl has a number of fundamental [[data type]]s, the most commonly used and discussed being: [[Scalar (computing)|scalars]], [[array]]s, [[Hash table|hashes]], [[filehandle]]s and [[subroutines]]:
| + | |
- | * A [[Scalar (computing)|scalar]] is a single value; it may be a number, a [[String (computer science)|string]] or a [[Reference (computer science)|reference]]
| + | |
- | * An [[array]] is an ordered collection of scalars
| + | |
- | * A hash, or [[associative array]], is a map from strings to scalars; the strings are called ''keys'' and the scalars are called ''values''.
| + | |
- | * A [[file handle]] is a map to a file, device, or pipe which is open for reading, writing, or both.
| + | |
- | * A subroutine is a piece of code that may be passed arguments, be executed, and return data
| + | |
| | | |
- | Most variables are marked by a leading [[Sigil (computer programming)|sigil]], which identifies the data type being accessed (not the type of the variable itself), except filehandles, which don't have a sigil. The same name may be used for variables of different data types, without conflict.
| + | ===Array Variables=== |
| | | |
- | <source lang="perl">
| + | @days = ("Monday", "Tuesday", "Wednesday"); |
- | $foo # a scalar
| + | |
- | @foo # an array
| + | |
- | %foo # a hash
| + | |
- | FOO # a file handle
| + | |
- | &FOO # a constant (but the & is optional)
| + | |
- | &foo # a subroutine (but the & is optional)
| + | |
- | </source>
| + | |
| | | |
- | [[File handle]]s and constants need not be uppercase, but it is a common convention because there is no sigil to denote them. Both are global in scope, but file handles are interchangeable with references to file handles, which can be stored in scalars, which in turn permit lexical scoping. Doing so is encouraged in [[Damian Conway]]'s ''Perl Best Practices''. As a convenience, the <code>open</code> function in Perl 5.6 and newer will autovivify undefined scalars to file handle references.
| + | @months = ("April", "May", "June"); |
| | | |
- | Numbers are written in the bare form; strings are enclosed by quotes of various kinds.
| + | ===Define A Hash=== |
| | | |
- | <source lang="perl">
| + | Hashes are complex lists with both a key and a value part for each element of the list. We define a hash using the percent symbol (%). |
- | $name = "joe";
| + | |
- | $color = 'red';
| + | |
| | | |
- | $number1 = 42;
| + | %coins = ("Quarter", 25, "Dime", 10, "Nickle", 5); |
- | $number2 = '42';
| + | |
| | | |
- | # This evaluates to true
| + | %ages = ("Jerry", 45, "Tom", 22, "Vickie", 38); |
- | if ($number1 == $number2) { print "Numbers and strings of numbers are the same!"; }
| + | |
| | | |
- | $answer = "The answer is $number1"; # Variable interpolation: The answer is 42
| + | Hashes are very complex data types, for now just understand the syntax of how to define one. Later we will take a closer look at these complex variables. |
- | $price = 'This device costs $42'; # No interpolation in single quotes
| + | |
| | | |
- | $album = "It's David Bowie's \"Heroes\""; # literal quotes inside a string;
| + | ===Strings=== |
- | $album = 'It\'s David Bowie\'s "Heroes"'; # same as above with single quotes;
| + | |
- | $album = q(It's David Bowie's "Heroes"); # the quote-like operators q() and qq() allow
| + | |
- | # almost any delimiter instead of quotes, to
| + | |
- | # avoid excessive backslashing
| + | |
| | | |
- | $multilined_string =<<EOF;
| + | Strings are scalar as we mentioned previously. There is no limit to the size of the string, any amount of characters, symbols, or words can make up your strings. |
- | This is my multilined string
| + | |
- | note that I am terminating it with the "EOF" word.
| + | |
- | EOF
| + | |
- | </source>
| + | |
| | | |
- | Perl will convert strings into numbers and vice versa depending on the context in which they are used. In the following example the strings $n and $m are treated as numbers when they are the arguments to the addition operator. This code prints the number '5', discarding non numeric information for the operation, although the variable values remain the same. (The string concatenation operator is the period, not the <code>+</code> symbol.)
| + | When defining a string you may use single or double quotations, you may also define them with the q subfunction. |
| | | |
- | <source lang="perl">
| + | $single = 'This string is single quoted'; |
- | $n = '3 apples'; | + | |
- | $m = '2 oranges';
| + | |
- | print $n + $m;
| + | |
- | </source>
| + | |
| | | |
- | Perl also has a boolean context that it uses in evaluating conditional statements. The following values all evaluate as false in Perl:
| + | $double = "This string is double quoted"; |
| | | |
- | <source lang="perl">
| + | $userdefined = q^Carrot is now our quote^; |
- | $false = 0; # the number zero
| + | |
- | $false = 0.0; # the number zero as a float
| + | |
- | $false = 0b0; # the number zero in binary
| + | |
- | $false = 0x0; # the number zero in hexadecimal
| + | |
- | $false = '0'; # the string zero
| + | |
- | $false = ""; # the empty string
| + | |
- | $false = undef; # the return value from undef | + | |
- | </source>
| + | |
| | | |
- | All other values are evaluated to true. This includes the odd self-describing literal string of "0 but true", which in fact is 0 as a number, but true when used as a boolean. (Any non-numeric string would also have this property, but this particular string is ignored by Perl with respect to numeric warnings.) A less explicit but more conceptually portable version of this string is '0E0' or '0e0', which does not rely on characters being evaluated as 0, as '0E0' is literally "zero times ten to the zeroth power."
| + | ====Formatting Strings w/ Formatting Characters==== |
| | | |
- | Evaluated boolean expressions also return scalar values. Although the documentation does not promise which ''particular'' true or false is returned (and thus cannot be relied on), many boolean operators return 1 for true and the empty-string for false (which evaluates to zero in a numeric context). The ''defined()'' function tells if the variable has any value set. In the above examples ''defined($false)'' is true for every value except ''undef''.
| + | Strings can be formatted to your liking using formatting characters. Some of these characters also work to format files created in PERL. Think of these characters as miniature functions. |
| | | |
- | If a specifically 1 or 0 result (as in C) is needed, an explicit conversion is thought by some authors to be required:
| + | '''Character Description''' |
| | | |
- | <source lang="perl">
| + | \L Transform all letters to lowercase |
- | my $real_result = $boolean_result ? 1 : 0;
| + | |
- | </source>
| + | |
| | | |
- | However, if it's known that the value is either 1 or ''undef'', an implicit conversion can be used instead:
| + | \l Transform the next letter to lowercase |
| | | |
- | <source lang="perl">
| + | \U Transform all letters to uppercase |
- | my $real_result = $boolean_result + 0;
| + | |
- | </source>
| + | |
| | | |
- | A list is written by listing its elements, separated by commas, and enclosed by parentheses where required by operator precedence.
| + | \u Transform the next letter to uppercase |
| | | |
- | <source lang="perl">
| + | \n Begin on a new line |
- | @scores = (32, 45, 16, 5);
| + | |
- | </source>
| + | |
| | | |
- | It can be written many other ways as well, some straightforward and some less so:
| + | \r Applys a carriage return |
| | | |
- | <source lang="perl">
| + | \t Applys a tab to the string |
- | # An explicit and straightforward way
| + | |
- | @scores = ('32', '45', '16', '5');
| + | |
| | | |
- | # Equivalent to the above, but the qw() quote-like operator saves typing of
| + | \f Applys a formfedd to the string |
- | # quotes and commas and reduces visual clutter; almost any delimiter can be
| + | |
- | # used instead of parentheses
| + | |
- | @scores = qw(32 45 16 5);
| + | |
| | | |
- | # The split function returns a list of strings, which are extracted
| + | \b Backspace |
- | # from the expression using a regex template.
| + | |
- | # This may be useful for reading from a file of comma-separated values (CSV)
| + | |
- | @scores = split /,/, '32,45,16,5';
| + | |
| | | |
- | # It's also possible to use a postfix for operator and aliasing of
| + | \a Bell |
- | # the $_ magic variable to the next value of the list during each
| + | |
- | # iteration; this is pointless here, but similar idioms are widely used
| + | |
- | # in some circumstances.
| + | |
- | push @scores, $_ foreach 32, 45, 16, 5;
| + | |
- | </source>
| + | |
| | | |
- | A hash may be initialized from a list of key/value pairs:
| + | \e Escapes the next character |
| | | |
- | <source lang="perl">
| + | \0nn Creates Octal formatted numbers |
- | %favorite = (
| + | |
- | joe => 'red',
| + | |
- | sam => 'blue'
| + | |
- | );
| + | |
- | </source>
| + | |
| | | |
- | The <code>=></code> operator is equivalent to a comma, except that it assumes quotes around the preceding token if it is a bare identifier: <code>(joe => 'red')</code> is the same as <code>('joe' => 'red')</code>. It can therefore be used to elide quote marks, improving readability.
| + | \xnn Creates Hexideciamal formatted numbers |
| | | |
- | Individual elements of a list are accessed by providing a numerical index, in square brackets. Individual values in a hash are accessed by providing the corresponding key, in curly braces. The <code>$</code> sigil identifies the accessed element as a scalar.
| + | \cX Control characters, x may be any character |
| | | |
- | <source lang="perl">
| + | \Q Do not match the pattern |
- | $scores[2] # an element of @scores
| + | |
- | $favorite{joe} # a value in %favorite
| + | |
- | </source>
| + | |
| | | |
- | Thus, a hash can also be specified by setting its keys individually:
| + | \E Ends \U, \L, or \Q functions |
| | | |
- | <source lang="perl">
| + | $mystring = "welcome to tizag.com!"; |
- | $favorite{joe} = 'red';
| + | |
- | $favorite{sam} = 'blue';
| + | |
- | </source>
| + | |
| | | |
- | Multiple elements may be accessed by using the <code>@</code> sigil instead (identifying the result as a list).
| + | $newline = "welcome to \ntizag.com!"; |
| | | |
- | <source lang="perl">
| + | $capital = "\uwelcome to tizag.com!"; |
- | @scores[2, 3, 1] # three elements of @scores
| + | |
- | @favorite{'joe', 'sam'} # two values in %favorite
| + | |
- | @favorite{qw(joe sam)} # same as above
| + | |
- | </source>
| + | |
| | | |
- | The number of elements in an array can be obtained by evaluating the array in scalar context or with the help of the <code>$#</code> sigil. The latter gives the index of the last element in the array, not the number of elements. ''Note: the [[syntax highlighting]] in Wikipedia's software mistakenly considers some of the following code to be part of the comments.''
| + | $ALLCAPS = "\Uwelcome to tizag.com!"; |
| | | |
- | <source lang="perl">
| + | Any combination of these special characters can be used at any time to properly punctuate your strings. They also come in handy when printing out HTML with your PERL functions. |
- | $count = @friends; # Assigning to a scalar forces scalar context
| + | |
| | | |
- | $#friends; # The index of the last element in @friends
| + | ====Substr() and String Indexing==== |
- | $#friends+1; # Usually the number of elements in @friends is one more
| + | |
- | # than $#friends because the first element is at index 0,
| + | |
- | # not 1, unless the programmer reset this to a different
| + | |
- | # value, which most Perl manuals discourage.
| + | |
- | </source>
| + | |
| | | |
- | There are a few functions that operate on entire hashes.
| + | The substr() function allows for the temporary replacement of characters in a string. We can change the string "Hello, PERL" to "Hello, World!" quite easily. Each character of the string is automatically assigned a numeric value by PERL, which means that we can index any of the characters in our strings with this number. PERL counts each character of the string beginning with 0 for the first character and continuing until it reaches the end of a string. |
| | | |
- | <source lang="perl">
| + | Two arguments must be sent with our substr() function, the string you wish to index and the index number. If two arguments are sent, PERL assumes that you are replacing every character from that index number to the end. |
- | @names = keys %addressbook;
| + | |
- | @addresses = values %addressbook;
| + | |
| | | |
- | # Every call to each returns the next key/value pair.
| + | substr($mystring, 7) = "World!"; |
- | # All values will be eventually returned, but their order
| + | |
- | # cannot be predicted.
| + | |
- | while (($name, $address) = each %addressbook) {
| + | |
- | print "$name lives at $address\n";
| + | |
- | }
| + | |
| | | |
- | # Similar to the above, but sorted alphabetically
| + | Because we only specified one numeric parameter for the string, PERL assumed we wanted to replace every character after the 7th, with our new string. If we throw a third parameter in our function we can replace only a chunk of our string with a new string. |
- | foreach my $next_name (sort keys %addressbook) {
| + | |
- | print "$next_name lives at $addressbook{$next_name}\n";
| + | |
- | }
| + | |
- | </source>
| + | |
| | | |
- | === Control structures === | + | ===Numbers=== |
- | {{main|Perl control structures}}
| + | |
| | | |
- | Perl has several kinds of control structures.
| + | Numbers are scalar data. They exist in PERL as real numbers, float, integers, exponents, octal, and hexidecimal numbers. |
| | | |
- | It has block-oriented control structures, similar to those in the C, [[Javascript]], and [[Java (programming language)|Java]] programming languages. Conditions are surrounded by parentheses, and controlled blocks are surrounded by braces:
| + | $real = 27; |
| | | |
- | ''label'' while ( ''cond'' ) { ... }
| + | $float = 3.14159; |
- | ''label'' while ( ''cond'' ) { ... } continue { ... }
| + | |
- | ''label'' for ( ''init-expr'' ; ''cond-expr'' ; ''incr-expr'' ) { ... }
| + | |
- | ''label'' foreach ''var'' ( ''list'' ) { ... }
| + | |
- | ''label'' foreach ''var'' ( ''list'' ) { ... } continue { ... }
| + | |
- | if ( ''cond'' ) { ... }
| + | |
- | if ( ''cond'' ) { ... } else { ... }
| + | |
- | if ( ''cond'' ) { ... } elsif ( ''cond'' ) { ... } else { ... }
| + | |
| | | |
- | Where only a single statement is being controlled, statement modifiers provide a more concise syntax:
| + | $integer = -4; |
| | | |
- | ''statement'' if ''cond'' ;
| + | $exponent = 10e12; |
- | ''statement'' unless ''cond'' ;
| + | |
- | ''statement'' while ''cond'' ;
| + | |
- | ''statement'' until ''cond'' ;
| + | |
- | ''statement'' foreach ''list'' ;
| + | |
| | | |
- | [[Short-circuit evaluation|Short-circuit logical operators]] are commonly used to affect control flow at the expression level: | + | [[Perl Conti.....]] |
- | | + | |
- | ''expr'' and ''expr''
| + | |
- | ''expr'' && ''expr''
| + | |
- | ''expr'' or ''expr''
| + | |
- | ''expr'' <nowiki>||</nowiki> ''expr''
| + | |
- | | + | |
- | (The "and" and "or" operators are similar to && and <nowiki>||</nowiki> but have lower [[precedence]], which makes it easier to use them to control entire statements.)
| + | |
- | | + | |
- | The flow control keywords <code>next</code> (corresponding to C's <code>continue</code>), <code>last</code> (corresponding to C's <code>break</code>), <code>return</code>, and <code>redo</code> are expressions, so they can be used with short-circuit operators.
| + | |
- | | + | |
- | Perl also has two implicit looping constructs, each of which has two forms: | + | |
- | | + | |
- | ''results'' = grep { ... } ''list''
| + | |
- | ''results'' = grep ''expr'', ''list''
| + | |
- | ''results'' = map { ... } ''list''
| + | |
- | ''results'' = map ''expr'', ''list''
| + | |
- | | + | |
- | <code>grep</code> returns all elements of ''list'' for which the controlled block or expression evaluates to true. <code>map</code> evaluates the controlled block or expression for each element of ''list'' and returns a list of the resulting values. These constructs enable a simple [[functional programming]] style.
| + | |
- | | + | |
- | Up until the 5.10.0 release, there was no [[switch statement]] in Perl 5. From 5.10.0 onwards, a multi-way branch statement called <code>given</code>/<code>when</code> is available, which takes the following form:
| + | |
- | | + | |
- | given ( ''expr'' ) { when ( ''cond'' ) { ... } default { ... } }
| + | |
- | | + | |
- | Syntactically, this structure behaves similarly to [[switch statement]]s found in other languages, but with a few important differences. The largest is that unlike switch/case structures, given/when statements break execution after the first successful branch, rather than waiting for explicitly defined break commands. Conversely, explicit continues are instead necessary to emulate switch behavior.
| + | |
- | | + | |
- | For those not using the 5.10.0 release, the Perl documentation describes a half-dozen ways to achieve the same effect by using other control structures. There is also a [http://search.cpan.org/perldoc/Switch Switch] module, which provides functionality modeled on the forthcoming [[Perl 6]] re-design. It is implemented using a [[source filter]], so its use is unofficially discouraged.<ref>[http://www.perlmonks.org/?node_id=496084 using switch<!-- Bot generated title -->]</ref>
| + | |
- | | + | |
- | Perl includes a <code>goto label</code> statement, but it is rarely used. Situations where a <code>goto</code> is called for in other languages don't occur as often in Perl due to its breadth of flow control options.
| + | |
- | | + | |
- | There is also a <code>goto &sub</code> statement that performs a [[tail call]]. It terminates the current subroutine and immediately calls the specified <code>''sub''</code>. This is used in situations where a caller can perform more efficient [[Call stack|stack]] management than Perl itself (typically because no change to the current stack is required), and in deep recursion tail calling can have substantial positive impact on performance because it avoids the overhead of scope/stack management on return.
| + | |
- | | + | |
- | === Subroutines ===
| + | |
- | [[Subroutine]]s are defined with the <code>sub</code> keyword, and invoked simply by naming them. If the subroutine in question has not yet been declared, invocation requires either parentheses after the function name or an ampersand ('''&''') before it. But using '''&''' without parentheses will also implicitly pass the arguments of the current subroutine to the one called, and using '''&''' with parentheses will bypass prototypes.
| + | |
- | | + | |
- | <source lang="perl">
| + | |
- | # Calling a subroutine
| + | |
- | | + | |
- | # Parentheses are required here if the subroutine is defined later in the code
| + | |
- | foo();
| + | |
- | &foo; # (this also works, but has other consequences regarding arguments passed to the subroutine)
| + | |
- | | + | |
- | # Defining a subroutine
| + | |
- | sub foo { ... }
| + | |
- | | + | |
- | foo; # Here parentheses are not required
| + | |
- | </source>
| + | |
- | | + | |
- | A list of arguments may be provided after the subroutine name. Arguments may be scalars, lists, or hashes.
| + | |
- | | + | |
- | <source lang="perl">
| + | |
- | foo $x, @y, %z;
| + | |
- | </source>
| + | |
- | The parameters to a subroutine do not need to be declared as to either number or type; in fact, they may vary from call to call. Any validation of parameters must be performed explicitly inside the subroutine.
| + | |
- | | + | |
- | Arrays are expanded to their elements, hashes are expanded to a list of key/value pairs, and the whole lot is passed into the subroutine as one flat list of scalars.
| + | |
- | | + | |
- | Whatever arguments are passed are available to the subroutine in the special array <code>@_</code>. The elements of <code>@_</code> are aliased to the actual arguments; changing an element of <code>@_</code> changes the corresponding argument.
| + | |
- | | + | |
- | Elements of <code>@_</code> may be accessed by subscripting it in the usual way.
| + | |
- | | + | |
- | <source lang="perl">
| + | |
- | $_[0], $_[1]
| + | |
- | </source>
| + | |
- | | + | |
- | However, the resulting code can be difficult to read, and the parameters have [[Evaluation strategy#Call by reference|pass-by-reference]] semantics, which may be undesirable.
| + | |
- | | + | |
- | One common idiom is to assign <code>@_</code> to a list of named variables.
| + | |
- | | + | |
- | <source lang="perl">
| + | |
- | my ($x, $y, $z) = @_;
| + | |
- | </source>
| + | |
- | | + | |
- | This provides mnemonic parameter names and implements [[Evaluation strategy#Call by value|pass-by-value]] semantics. The <code>my</code> keyword indicates that the following variables are lexically scoped to the containing block.
| + | |
- | | + | |
- | Another idiom is to shift parameters off of <code>@_</code>. This is especially common when the subroutine takes only one argument, or for handling the <code>$self</code> argument in object-oriented modules.
| + | |
- | | + | |
- | <source lang="perl">
| + | |
- | my $x = shift;
| + | |
- | </source>
| + | |
- | | + | |
- | Subroutines may assign <code>@_</code> to a hash to simulate named arguments; this is recommended in ''Perl Best Practices'' for subroutines that are likely ever to have more than three parameters.<ref>
| + | |
- | Damian Conway, ''[http://www.oreilly.com/catalog/perlbp/chapter/ch09.pdf Perl Best Practices]'', p.182</ref>
| + | |
- | | + | |
- | <source lang="perl">
| + | |
- | sub function1 {
| + | |
- | my %args = @_;
| + | |
- | print "'x' argument was '$args{x}'\n";
| + | |
- | }
| + | |
- | function1( x => 23 );
| + | |
- | </source>
| + | |
- | | + | |
- | Subroutines may return values.
| + | |
- | | + | |
- | <source lang="perl">
| + | |
- | return 42, $x, @y, %z;
| + | |
- | </source>
| + | |
- | | + | |
- | If the subroutine does not exit via a <code>return</code> statement, then it returns the last expression evaluated within the subroutine body. Arrays and hashes in the return value are expanded to lists of scalars, just as they are for arguments.
| + | |
- | | + | |
- | The returned expression is evaluated in the calling context of the subroutine; this can surprise the unwary.
| + | |
- | | + | |
- | <source lang="perl">
| + | |
- | sub list { (4, 5, 6) }
| + | |
- | sub array { @x = (4, 5, 6); @x }
| + | |
- | | + | |
- | $x = list; # returns 6 - last element of list
| + | |
- | $x = array; # returns 3 - number of elements in list
| + | |
- | @x = list; # returns (4, 5, 6)
| + | |
- | @x = array; # returns (4, 5, 6)
| + | |
- | </source>
| + | |
- | | + | |
- | A subroutine can discover its calling context with the <code>wantarray</code> function.
| + | |
- | | + | |
- | <source lang="perl">
| + | |
- | sub either {
| + | |
- | return wantarray ? (1, 2) : 'Oranges';
| + | |
- | }
| + | |
- | | + | |
- | $x = either; # returns "Oranges"
| + | |
- | @x = either; # returns (1, 2)
| + | |
- | </source>
| + | |
- | | + | |
- | === Regular expressions ===
| + | |
- | The Perl language includes a specialized syntax for writing [[regular expression]]s (RE, or regexes), and the interpreter contains an engine for matching strings to regular expressions. The regular expression engine uses a [[backtracking]] algorithm, extending its capabilities from simple pattern matching to string capture and substitution. The regular expression engine is derived from regex written by [[Henry Spencer]].
| + | |
- | | + | |
- | The Perl regular expression syntax was originally taken from Unix Version 8 regular expressions. However, it diverged before the first release of Perl, and has since grown to include many more features. Other languages and applications are now adopting [[PCRE|Perl compatible regular expressions]] over [[POSIX]] regular expressions including [[PHP]], [[Ruby programming language|Ruby]], [[Java (programming language)|Java]], Microsoft's [[.NET Framework]]<ref>Microsoft Corp., ".NET Framework Regular Expressions", ''.NET Framework Developer's Guide'', [http://msdn2.microsoft.com/en-us/library/hs600312(VS.71).aspx]</ref>, and the [[Apache HTTP server]].
| + | |
- | | + | |
- | Regular expression syntax is extremely compact, owing to history. The first regular expression dialects were only slightly more expressive than [[Glob (programming)|globs]], and the syntax was designed so that an expression would resemble the text it matches{{Fact|date=June 2007}}. This meant using no more than a single punctuation character or a pair of delimiting characters to express the few supported assertions. Over time, the expressiveness of regular expressions grew tremendously, but the syntax design was never revised and continues to rely on punctuation. As a result, regular expressions can be cryptic and extremely dense.
| + | |
- | | + | |
- | ==== Uses ====
| + | |
- | The <code>m//</code> (match) operator introduces a regular expression match. (If it is delimited by slashes, as in all the examples here, then the leading <code>m</code> may be omitted for brevity. If the <code>m</code> is present, as in all the following examples, other delimiters can be used in place of slashes.) In the simplest case, an expression like
| + | |
- | | + | |
- | <source lang="perl">
| + | |
- | $x =~ m/abc/;
| + | |
- | </source>
| + | |
- | | + | |
- | evaluates to true [[if and only if]] the string <code>$x</code> matches the regular expression <code>abc</code>.
| + | |
- | | + | |
- | The <code>s///</code> (substitute) operator, on the other hand, specifies a search and replace operation:
| + | |
- | | + | |
- | <source lang="perl">
| + | |
- | $x =~ s/abc/aBc/; # upcase the b
| + | |
- | </source>
| + | |
- | | + | |
- | Another use of regular expressions is to specify delimiters for the <code>split</code> function:
| + | |
- | | + | |
- | <source lang="perl">
| + | |
- | @words = split m/,/, $line;
| + | |
- | </source>
| + | |
- | | + | |
- | The <code>split</code> function creates a list of the parts of the string separated by matches of the regular expression. In this example, a line is divided into a list of its comma-separated parts, and this list is then assigned to the <code>@words</code> array.
| + | |
- | | + | |
- | ==== Syntax ====
| + | |
- | Portions of a regular expression may be enclosed in parentheses; corresponding portions of a matching string are ''captured''. Captured strings are assigned to the sequential built-in variables <code>$1, $2, $3, ...</code>, and a list of captured strings is returned as the value of the match.
| + | |
- | | + | |
- | <source lang="perl">
| + | |
- | $x =~ m/a(.)c/; # capture the character between 'a' and 'c'
| + | |
- | </source>
| + | |
- | | + | |
- | Perl regular expressions can take ''modifiers''. These are single-letter suffixes that modify the meaning of the expression:
| + | |
- | | + | |
- | <source lang="perl">
| + | |
- | $x =~ m/abc/i; # case-insensitive pattern match
| + | |
- | $x =~ s/abc/aBc/g; # global search and replace
| + | |
- | </source>
| + | |
- | | + | |
- | Since regular expressions can be dense and cryptic because of their compact syntax, the <code>/x</code> modifier was added in Perl to help programmers write more legible regular expressions. It allows programmers to place whitespace and comments ''inside'' regular expressions:
| + | |
- | | + | |
- | <source lang="perl">
| + | |
- | $x =~ m/a # match 'a'
| + | |
- | . # followed by any character
| + | |
- | c # then followed by the 'c'character
| + | |
- | /x;
| + | |
- | </source>
| + | |
- | | + | |
- | == Database interfaces ==
| + | |
- | Perl is widely favored for database applications. Its text handling facilities are useful for generating [[SQL]] queries; arrays, hashes and automatic memory management make it easy to collect and process the returned data.
| + | |
- | | + | |
- | In early versions of Perl, database interfaces were created by relinking the interpreter with a client-side database library. This was sufficiently difficult that it was only done for a few of the most important and widely used databases, and restricted the resulting <code>perl</code> executable to using just one database interface at a time.
| + | |
- | | + | |
- | In Perl 5, database interfaces are implemented by [[Perl DBI]] modules. The DBI (Database Interface) module presents a single, database-independent interface to Perl applications, while the DBD (Database Driver) modules handle the details of accessing some 50 different databases; there are DBD drivers for most [[American National Standards Institute|ANSI]] [[SQL]] databases.
| + | |
- | | + | |
- | DBI provides caching for database handles and queries, which can greatly improve performance in long-lived execution environments such as [[mod_perl]]<ref>{{cite web | last = Bekman | first = Stas | title = Efficient Work with Databases under mod_perl | url = http://perl.apache.org/docs/1.0/guide/performance.html#Efficient_Work_with_Databases_under_mod_perl | accessdate = 2007-09-01 }}</ref>, helping high-volume systems avert load spikes as in the [[Slashdot effect]].
| + | |
- | | + | |
- | == Comparative performance ==
| + | |
- | ''The Computer Language Benchmarks Game''<ref>[http://shootout.alioth.debian.org/ The Computer Language Benchmarks Game<!-- Bot generated title -->]</ref> compares the performance of implementations of typical programming problems in several programming languages. The submitted Perl implementations were typically towards the high end of the memory usage spectrum, and had varied speed results. Perl's performance in the benchmarks game is similar to other interpreted languages such as Python, faster than PHP, and significantly faster than Ruby, but slower than most compiled languages.
| + | |
- | | + | |
- | Perl programs can start slower than similar programs in compiled languages because perl has to compile the source every time it runs. In a talk at the [[YAPC|YAPC::Europe 2005]] conference and subsequent article, "A Timely Start", Jean-Louis Leroy found that his Perl programs took much longer to run than he expected because the perl interpreter spent much of the time finding modules because of his over-large include path.<ref>{{cite web | url=http://www.perl.com/pub/a/2005/12/21/a_timely_start.html | title=A Timely Start | author=Leroy, Jean-Louis | date=2005-12-01 | publisher=Perl.com }}</ref> Because pre-compiling is still an experimental part of Perl<ref>{{cite web | url=http://search.cpan.org/~nwclark/perl-5.8.8/ext/B/B/Bytecode.pm#KNOWN_BUGS | title=B::Bytecode Perl compiler's bytecode backend | author=Beattie, Malcolm and Enache Adrian | year=2003 | publisher=search.cpan.org }}</ref>—unlike that of Java, Python, and Ruby—Perl programs pay this overhead penalty on every execution. When [[amortized]] over a long run phase, startup time is not typically substantial, but measurement of very short execution times can often be skewed as is often found in benchmarks.
| + | |
- | | + | |
- | A number of tools have been introduced to improve this situation, the first of which was Apache's [[mod_perl]], which sought to address one of the most common reasons that small Perl programs were invoked rapidly: [[Common Gateway Interface|CGI]] [[World Wide Web|Web]] development. [[ActiveState|ActivePerl]], via Microsoft [[ISAPI]] provides similar performance improvements.
| + | |
- | | + | |
- | Once Perl code is compiled, there is additional overhead during the execution phase that typically isn't present for programs written in compiled languages like C or C++, including, among many other things, overhead due to bytecode interpretation, reference-counting memory management, and dynamic type checking.
| + | |
- | | + | |
- | === Optimizing ===
| + | |
- | Perl programs, like any code, can be [[Optimization (computer science)|tuned for performance]] using [[Benchmark (computing)|benchmarks]] and [[Performance analysis|profiles]] after a readable and correct implementation is finished. In part because of Perl's interpreted nature, writing more efficient Perl will not always be enough to meet one's performance goals for a program.
| + | |
- | | + | |
- | In such situations, the most critical routines of a Perl program can be written in other languages such as [[C (programming language)|C]] or [[Assembly language|Assembler]], which can be connected to Perl via simple Inline modules or the more complex but flexible [[XS (Perl)|XS]] mechanism.<ref>http://search.cpan.org/perldoc/Inline/</ref> Nicholas Clark, a Perl core developer, discusses some Perl design trade-offs and some solutions in ''When perl is not quite fast enough''.<ref>[http://www.ccl4.org/~nick/P/Fast_Enough/ When perl is not quite fast enough<!-- Bot generated title -->]</ref>
| + | |
- | | + | |
- | In extreme cases, optimizing Perl can require intimate knowledge of the interpreter's workings rather than skill with algorithms, the Perl language, or general principles of optimization.{{Fact|date=July 2007}}
| + | |
- | | + | |
- | == Future ==
| + | |
- | {{main|Perl 6}}
| + | |
- | At the 2000 [[Perl Conference]], [[Jon Orwant]] made a case for a major new language initiative.<ref>[http://www.nntp.perl.org/group/perl.perl6.meta/424 Transcription of Larry's talk]. Retrieved on 2006 September 28.</ref> This led to a decision to begin work on a redesign of the language, to be called Perl 6. Proposals for new language features were solicited from the Perl community at large, and over 300 [[Request for Comments|RFCs]] were submitted.
| + | |
- | | + | |
- | [[Larry Wall]] spent the next few years digesting the RFCs and synthesizing them into a coherent framework for Perl 6. He has presented his design for Perl 6 in a series of documents called "apocalypses", which are numbered to correspond to chapters in ''[[Programming Perl]]'' ("The Camel Book"). The current, not yet finalized specification of Perl 6 is encapsulated in design documents called Synopses, which are numbered to correspond to Apocalypses.
| + | |
- | | + | |
- | Perl 6 is not intended to be backward compatible, though there will be a compatibility mode.
| + | |
- | | + | |
- | Thesis work by [[Bradley M. Kuhn]], overseen by Larry Wall, considered the possible use of the [[Java virtual machine]] as a runtime for Perl.<ref>{{cite paper
| + | |
- | | last = Kuhn
| + | |
- | | first = Bradley
| + | |
- | | authorlink = Bradley M. Kuhn
| + | |
- | | title = Considerations on Porting Perl to the Java Virtual Machine
| + | |
- | | publisher = University of Cincinnati
| + | |
- | | date = January 2001
| + | |
- | | url = http://www.ebb.org/bkuhn/writings/technical/thesis/
| + | |
- | | accessdate = 2008-06-28}}</ref> Kuhn's thesis showed this approach to be problematic, and in 2001, it was decided that Perl 6 would run on a cross-language [[virtual machine]] called [[Parrot virtual machine|Parrot]]. This will mean that other languages targeting the Parrot will gain native access to [[CPAN]], allowing some level of cross-language development.
| + | |
- | | + | |
- | In 2005 [[Audrey Tang]] created the [[pugs]] project, an implementation of Perl 6 in [[Haskell (programming language)|Haskell]]. This was and continues to act as a test platform for the Perl 6 language (separate from the development of the actual implementation) allowing the language designers to explore. The pugs project spawned an active Perl/Haskell cross-language community centered around the [[freenode]] #perl6 irc channel.
| + | |
- | | + | |
- | A number of features in the Perl 6 language now show similarities with Haskell, and Perl 6 has been embraced by the Haskell community as a potential scripting language{{Fact|date=October 2007}}.
| + | |
- | | + | |
- | [[As of 2006]], Perl 6, Parrot, and pugs are under active development, and a new module for Perl 5 called [[v6 (Perl)|v6]] allows some Perl 6 code to run directly on top of Perl 5.
| + | |
- | | + | |
- | Development of Perl 5 is also continuing. Perl 5.10 was released in December of 2007, with some new features influenced by the design of Perl 6.
| + | |
- | | + | |
- | == The Perl community ==
| + | |
- | Perl's culture and community has developed alongside the language itself. [[Usenet]] was the first public venue in which Perl was introduced, but over the course of its evolution, Perl's community was shaped by the growth of broadening Internet-based services including the introduction of the World Wide Web. The community that surrounds Perl was, in fact, the topic of Larry Wall's first "State of the Onion" talk.<ref>{{ cite web | url=http://www.wall.org/~larry/keynote/keynote.html | title=Perl Culture (AKA the first State of the Onion) | first=Larry | last=Wall | authorlink=Larry Wall | date=1997-08-20 }}</ref>
| + | |
- | | + | |
- | === State of the Onion ===
| + | |
- | State of the Onion is the name for Larry Wall’s yearly [[keynote]]-style summaries on the progress of Perl and its community. They are characterized by his hallmark humor, employing references to Perl’s and the wider hacker culture, as well as Wall’s linguistic and sometimes his Christian background.
| + | |
- | | + | |
- | Each talk is first given at various Perl conferences and eventually also published online.
| + | |
- | | + | |
- | === Pastimes ===
| + | |
- | Perl's pastimes have become a defining element of the community. Included among them are trivial and complex uses of the language.
| + | |
- | | + | |
- | ==== JAPHs ====
| + | |
- | In email, Usenet and message board postings, "[[Just another Perl hacker]]" (JAPH) programs have become a common trend, originated by [[Randal L. Schwartz]], one of the earliest professional Perl trainers.<ref>{{cite newsgroup | author = [[Randal L. Schwartz]] | title = Who is Just another Perl hacker? | id = [email protected] | newsgroup = comp.lang.perl.misc | date = 1999-05-02 | url = http://groups.google.com/[email protected] | accessdate = 2007-11-12 }}</ref> | + | |
- | | + | |
- | In the parlance of Perl culture, Perl programmers are known as Perl hackers, and from this derives the practice of writing short programs to print out the phrase "[[Just another Perl hacker]],". In the spirit of the original concept, these programs are moderately obfuscated and short enough to fit into the signature of an email or Usenet message. The "canonical" JAPH includes the comma at the end, although this is often omitted.
| + | |
- | | + | |
- | ==== Perl golf ====
| + | |
- | Perl "golf" is the pastime of reducing the number of characters (key "strokes") used in a Perl program to the bare minimum, much as how [[golf]] players seek to take as few shots as possible in a round. This use of the word "golf" originally focused on the JAPHs used in signatures in Usenet postings and elsewhere, though the same stunts had been an unnamed pastime in the language [[APL (programming language)|APL]] in previous decades. The use of Perl to write a program which performed [[RSA]] encryption prompted a widespread and practical interest in this pastime.<ref>[http://www.cypherspace.org/adam/rsa/story.html The quest for the most diminutive munitions program<!-- Bot generated title -->]</ref> In subsequent years, code golf has been taken up as a pastime in other languages besides Perl.<ref>{{cite web | url=http://codegolf.com/ | title=Code Golf: What is Code Golf? | publisher=29degrees | date=2007 }}</ref>
| + | |
- | | + | |
- | ==== Obfuscation ====
| + | |
- | As with C, [[obfuscated code]] competitions are a well-known pastime. The annual [[Obfuscated Perl contest]] made an arch virtue of Perl's syntactic flexibility.
| + | |
- | | + | |
- | ==== Poetry ====
| + | |
- | Similar to obfuscated code and golf, but with a different purpose, Perl poetry is the practice of writing poems that can actually be compiled as legal (although generally non-sensical) Perl code. This hobby is more or less unique to Perl due to the large number of regular English words used in the language. New poems are regularly published in the [[Perl Monks]] site's Perl Poetry section.<ref>[http://www.perlmonks.org/?node_id=1590 Perl Poetry section] on [[Perl Monks]]</ref>
| + | |
- | | + | |
- | ==== CPAN Acme ====
| + | |
- | There are also many examples of code written purely for entertainment on the [[CPAN]]. <code>Lingua::Romana::Perligata</code>, for example, allows writing programs in [[Latin]].<ref>{{ cite web | url=http://www.csse.monash.edu.au/~damian/papers/HTML/Perligata.html | title=Lingua::Romana::Perligata -- Perl for the XXI-imum Century | author=Conway, Damian }}</ref> Upon execution of such a program, the module translates its source code into regular Perl and runs it.
| + | |
- | | + | |
- | The Perl community has set aside the "[[Acme Corporation|Acme]]" namespace for modules that are fun in nature (but its scope has widened to include exploratory or experimental code or any other module that is not meant to ever be used in production). Some of the Acme modules are deliberately implemented in amusing ways. This includes <code>Acme::Bleach</code>, one of the first modules in the <code>Acme::</code> namespace,<ref>{{cite web | url=http://use.perl.org/~acme/journal/200 | title=use Perl; Journal of acme | date=2001-05-23 | author=Brocard, Leon }}</ref> which allows the program's source code to be "whitened" (i.e., all characters replaced with whitespace) and yet still work.
| + | |
- | | + | |
- | == Further reading ==
| + | |
- | * ''[[Learning Perl]]'', Fifth Edition (the ''Llama book''), ISBN 0-596-52010-6
| + | |
- | * ''[[Perl Cookbook]]'', ISBN 0-596-00313-7
| + | |
- | * ''[[Programming Perl]]'', (the ''Camel book''), ISBN 0-596-00027-8
| + | |
- | | + | |
- | == See also ==
| + | |
- | {{portal|Free software|Free Software Portal Logo.svg}}
| + | |
- | * [[The Perl Foundation]]
| + | |
- | * [[v:Topic:Perl|Perl]] instruction at Wikiversity—you can use the training and/or help add to it
| + | |
- | * [[Perl Object Environment]] (POE)—a framework for writing persistent object-oriented environments with [[event loop]]s.
| + | |
- | * [[Perl Data Language]] (PDL)—a Perl module which allows extending Perl for higher-order scientific processing.
| + | |
- | * [[Plain Old Documentation]] (POD)—a documentation tool for Perl.
| + | |
- | * [[Just another Perl hacker]] (JAPH)
| + | |
- | * [[Perl Monks]]
| + | |
- | * [[Perl Mongers]]
| + | |
- | * [[PerlScript]]
| + | |
- | * [[Perl 6]]
| + | |
- | * [[Comparison of programming languages]]
| + | |
- | * [[Autovivification]]
| + | |
- | * [[Common Gateway Interface]] (CGI)
| + | |
- | | + | |
- | == References ==
| + | |
- | {{reflist|2}}
| + | |
- | | + | |
- | == External links ==
| + | |
- | <!-- Before adding any links, make sure you have read the External Links style guide, then stopped and reread it again. If you aren't absolutely sure the link is in compliance, ask on the talk page first -->
| + | |
- | {{wikibooks|Perl Programming}}
| + | |
- | {{wikiversity2|Topic:Perl}}
| + | |
- | * [http://www.perl.org/ Perl.org]—Official Perl website
| + | |
- | * [http://perldoc.perl.org/ Perl documentation]
| + | |
- | * [http://www.perlfoundation.org/ The Perl Foundation]
| + | |
- | * [http://www.perlfoundation.org/perl5/ Official Perl 5 Wiki]
| + | |
- | * {{dmoz|Computers/Programming/Languages/Perl/|Perl}}
| + | |
- | {{Perl}}
| + | |
- | {{FOSS}}
| + | |
- | | + | |
- | [[Category:Perl|*]]
| + | |
- | [[Category:Curly bracket programming languages]]
| + | |
- | [[Category:Dynamic programming languages]]
| + | |
- | [[Category:Dynamically-typed programming languages]]
| + | |
- | [[Category:Free compilers and interpreters]]
| + | |
- | [[Category:Procedural programming languages]]
| + | |
- | [[Category:Scripting languages]]
| + | |
- | [[Category:Text-oriented programming languages]]
| + | |
- | [[Category:Unix software]]
| + | |
Since then its popularity has increased due to its flexibility, portability, usefulness, and its varied features. To get started, load a simple text editor program and follow along in our examples.
First things first, you must have latest version of PERL installed on your web hosting machine available for download via Perl.com, just follow the download links. They also offer installation help for a wide variety of operating systems. We suggest you direct any installation help to the experts there.
This page will be web based, working with and creating files over the internet. File management is the bread and butter of the PERL language, and as you will discover, it's absolutely perfect for doing so.
A PERL script can be created inside of any normal simple-text editor program. There are several programs available for every type of platform. There are many programs designed for programmers available for download on the web.
Regardless of the program you choose to use, a PERL file must be saved with a .pl (.PL) file extension in order to be recognized as a functioning PERL script. File names can contain numbers, symbols, and letters but must not contain a space. Use an underscore (_) in places of spaces.
With PERL installed we are ready to dive into our first script. There are a few elements every PERL script must contain in order to function. Open up your favorite simple text editor, the file extension for PERL scripts is .pl. Save your files with this extension.
The first line of every PERL script is a commented line directed toward the PERL interpreter. This line is generally the same from one instal of PERL to the next, it might look something like this:
The comment points to the installation path of PERL, usually /usr/bin/perl. If not, you can locate the directory tree to PERL somewhere in the documentation of your web server, or email your web host and they can specify your PERL installation directory.
Because we are working in a web environment we are sort of jumping ahead of the game. We have to introduce some HTTP headers so that PERL understands we are working with a web browser. To do this we have to run another line of strange code called an HTTP header as you may have guessed. It looks something like this:
At this point our script still has no real functionality, all we have done thus far is locate our PERL interpreter and tell it that we are going to be working with a web browser or in a web environment.
Now that we have located the interpreter and told PERL we are working with the web, we can print text to the browser using print function.
You should see "Hello, PERL!" in the top left corner of your browser, pretty simple and straightforward.
Now it is time to upload your firstscript.pl to your web server and execute it. After you upload your file be sure to CHMOD the script file and allow anonymous execution priviledge, generally a setting of 755 works perfectly.
You script is working perfectly if you are staring at a blank screen and didn't recieve a 500 or 404 error message.
If you are using an FTP program to upload your scripts, set the upload type to ASCII or "Text". This setting prevents the mysterious addition of random characters that sometimes happens when copying files across different operating systems. Learning to do this prevents hours of headaches and frustration.
Another great debugging technique is to isolate the code you are currently working on. To do this you can temporarily comment out lines of code to isolate only the section that is returning an error message.
PERL follows a very specific syntax not unlike other programming languages. It is important to develop good syntax habits as it will save you from having to debug things later, not to mention save yourself from eye strain and mind numbing headaches.
File names, variables, and arrays are all case sensitive. If you capitalize a variable name when you define it, you must capitalize it to call it.
A great tip for large scripts containing a vast number of variable names it is best to be consistent with your case sensitivity and maybe even develop a system for naming variables that makes sense to you. For the majority of us programmers, capitals are simply not an option.
As with any programming language, PERL offers an escape from your code via the '#' sign. Any words, spaces, or marks after a pound symbol will be ignored by the program interpreter, offering you the coder, a chance to place reminders to yourself about your code. It's a great way to note specifics of your code to yourself or others viewing your code/script. Comments are necessary for any script you wish to publish to others or make readily available.
PERL Comment:
This comment is extreme and overdone, you might see more comments like this in scripts that are offered free on the internet. Often programmers will include a large commented section as an installation or set-up guide included right there in the script itself.
In PERL we use the backslash (\) character to escape any type of character that might interfere with our code. For example there may become a time when you would like to print a dollar sign rather than use one to define a variable. To do this you must "escape" the character using a backslash (\).
David paid $4.34 for Larry's shirt.
A variable is defined by the ($) symbol (scalar), the (@) symbol (arrays), or the (%) symbol (hashes).
The latter example using the my parameter is another means to define a variable that you might run across as you gain more experience. It is not necessary to use the my parameter. Variables can be defined either way.
Scalar variables are simple variables containing only one element--a string, a number, or a reference. Strings may contain any symbol, letter, or number. Numbers may contain exponents, integers, or decimal values. The bottom line here with scalar variables is that they contain only one single piece of data. What you see is what you get with scalar variables.
Scalars are very straight forward. Notice that we used a period (.) between each of our variables. This is a special kind of operator that concatenates two or more variables.
Hashes are complex lists with both a key and a value part for each element of the list. We define a hash using the percent symbol (%).
Hashes are very complex data types, for now just understand the syntax of how to define one. Later we will take a closer look at these complex variables.
Strings are scalar as we mentioned previously. There is no limit to the size of the string, any amount of characters, symbols, or words can make up your strings.
When defining a string you may use single or double quotations, you may also define them with the q subfunction.
Strings can be formatted to your liking using formatting characters. Some of these characters also work to format files created in PERL. Think of these characters as miniature functions.
Any combination of these special characters can be used at any time to properly punctuate your strings. They also come in handy when printing out HTML with your PERL functions.
The substr() function allows for the temporary replacement of characters in a string. We can change the string "Hello, PERL" to "Hello, World!" quite easily. Each character of the string is automatically assigned a numeric value by PERL, which means that we can index any of the characters in our strings with this number. PERL counts each character of the string beginning with 0 for the first character and continuing until it reaches the end of a string.
Two arguments must be sent with our substr() function, the string you wish to index and the index number. If two arguments are sent, PERL assumes that you are replacing every character from that index number to the end.
Because we only specified one numeric parameter for the string, PERL assumed we wanted to replace every character after the 7th, with our new string. If we throw a third parameter in our function we can replace only a chunk of our string with a new string.
Numbers are scalar data. They exist in PERL as real numbers, float, integers, exponents, octal, and hexidecimal numbers.