home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Il CD di internet
/
CD.iso
/
SOURCE
/
D
/
PERL
/
PERL-4.036
/
PERL-4
/
perl-4.036
/
Info
/
perl.info-2
< prev
next >
Encoding:
Amiga
Atari
Commodore
DOS
FM Towns/JPY
Macintosh
Macintosh JP
Macintosh to JP
NeXTSTEP
RISC OS/Acorn
Shift JIS
UTF-8
Wrap
GNU Info File
|
1994-07-08
|
47.9 KB
|
1,218 lines
This is Info file perl.info, produced by Makeinfo-1.55 from the input
file perltexi.
This file documents perl, Practical Extraction and Report Language,
and was originally based on Larry Wall's unix-style man page for perl.
GNU Texinfo version adapted by Jeff Kellem
<composer@Beyond.Dreams.ORG>.
Copyright (C) 1989, 1990, 1991, 1992, 1993 Larry Wall Texinfo
version Copyright (C) 1990, 1991, 1993 Jeff Kellem
Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.
Permission is granted to copy and distribute modified versions of
this manual under the conditions for verbatim copying, provided also
that the sections entitled "GNU General Public License" and "Conditions
for Using Perl" are included exactly as in the original, and provided
that the entire resulting derived work is distributed under the terms
of a permission notice identical to this one.
Permission is granted to copy and distribute translations of this
manual into another language, under the above conditions for modified
versions, except that the section entitled "GNU General Public License"
and this permission notice may be included in translations approved by
the Free Software Foundation instead of in the original English.
File: perl.info, Node: Data Types, Next: Syntax, Prev: Perl Startup, Up: Top
Data Types and Objects
**********************
*Perl* has three data types: scalars, arrays of scalars, and
associative arrays of scalars. Normal arrays are indexed by number,
and associative arrays by string.
The interpretation of operations and values in perl sometimes
depends on the requirements of the context around the operation or
value. There are three major contexts: "string", "numeric" and "array".
Certain operations return array values in contexts wanting an array, and
scalar values otherwise. (If this is true of an operation it will be
mentioned in the documentation for that operation.) Operations which
return scalars don't care whether the context is looking for a string or
a number, but scalar variables and values are interpreted as strings or
numbers as appropriate to the context. A scalar is interpreted as TRUE
in the boolean sense if it is not the null string or 0. Booleans
returned by operators are 1 for TRUE and 0 or '' (the null string [two
single right quotes]) for FALSE.
There are actually two varieties of null strings: "defined" and
"undefined". Undefined null strings are returned when there is no real
value for something, such as when there was an error, or at end of
file, or when you refer to an uninitialized variable or element of an
array. An undefined null string may become defined the first time you
access it, but prior to that you can use the `defined()' operator to
determine whether the value is defined or not.
References to scalar variables always begin with `$', even when
referring to a scalar that is part of an array. Thus:
$days # a simple scalar variable
$days[28] # 29th element of array @days
$days{'Feb'} # one value from an associative array
$#days # last index of array @days
but entire arrays or array slices are denoted by `@':
@days # ($days[0], $days[1],... $days[n])
@days[3,4,5] # same as @days[3..5]
@days{'a','c'} # same as ($days{'a'},$days{'c'})
and entire associative arrays are denoted by `%':
%days # (key1, val1, key2, val2 ...)
Any of these eight constructs may serve as an lvalue, that is, may be
assigned to. (It also turns out that an assignment is itself an lvalue
in certain contexts--see examples under `s', `tr' and `chop'.)
Assignment to a scalar evaluates the righthand side in a scalar
context, while assignment to an array or array slice evaluates the
righthand side in an array context.
You may find the length of array `@days' by evaluating `$#days', as
in `csh'. (Actually, it's not the length of the array, it's the
subscript of the last element, since there is (ordinarily) a 0th
element.) Assigning to `$#days' changes the length of the array.
Shortening an array by this method does not actually destroy any
values. Lengthening an array that was previously shortened recovers
the values that were in those elements. You can also gain some measure
of efficiency by preextending an array that is going to get big. (You
can also extend an array by assigning to an element that is off the end
of the array. This differs from assigning to `$#whatever' in that
intervening values are set to null rather than recovered.) You can
truncate an array down to nothing by assigning the null list `()' to
it. The following are exactly equivalent:
@whatever = ();
$#whatever = $[ - 1;
If you evaluate an array in a scalar context, it returns the length of
the array. The following is always true:
scalar(@whatever) == $#whatever - $[ + 1;
If you evaluate an associative array in a scalar context, it returns
a value which is true if and only if the array contains any elements.
(If there are any elements, the value returned is a string consisting
of the number of used buckets and the number of allocated buckets,
separated by a slash.)
Multi-dimensional arrays are not directly supported, but see the
discussion of the `$;' variable later for a means of emulating multiple
subscripts with an associative array. You could also write a
subroutine to turn multiple subscripts into a single subscript.
Every data type has its own namespace. You can, without fear of
conflict, use the same name for a scalar variable, an array, an
associative array, a filehandle, a subroutine name, and/or a label.
Since variable and array references always start with `$', `@', or `%',
the "reserved" words aren't in fact reserved with respect to variable
names. (They *ARE* reserved with respect to labels and filehandles,
however, which don't have an initial special character. Hint: you
could say `open(LOG,'logfile')' rather than `open(log,'logfile')'.
Using uppercase filehandles also improves readability and protects you
from conflict with future reserved words.) Case *IS*
significant--`FOO', `Foo' and `foo' are all different names. Names
which start with a letter may also contain digits and underscores.
Names which do not start with a letter are limited to one character,
e.g. `$%' or `$$'. (Most of the one character names have a predefined
significance to *perl*. More later.)
Numeric literals are specified in any of the usual floating point or
integer formats:
12345
12345.67
.23E-10
0xffff # hex
0377 # octal
4_294_967_296
String literals are delimited by either single or double quotes.
They work much like shell quotes: double-quoted string literals are
subject to backslash and variable substitution; single-quoted strings
are not (except for \' and \\). The usual backslash rules apply for
making characters such as newline, tab, etc., as well as some more
exotic forms:
\t tab
\n newline
\r return
\f form feed
\b backspace
\a alarm (bell)
\e escape
\033 octal char
\x1b hex char
\c[ control char
\l lowercase next char
\u uppercase next char
\L lowercase till \E
\U uppercase till \E
\E end case modification
You can also embed newlines directly in your strings, i.e. they can
end on a different line than they begin. This is nice, but if you
forget your trailing quote, the error will not be reported until *perl*
finds another line containing the quote character, which may be much
further on in the script. Variable substitution inside strings is
limited to scalar variables, normal array values, and array slices. (In
other words, identifiers beginning with `$' or `@', followed by an
optional bracketed expression as a subscript.) The following code
segment prints out `The price is $100.'
$Price = '$100'; # not interpreted
print "The price is $Price.\n"; # interpreted
Note that you can put curly brackets around the identifier to
delimit it from following alphanumerics. Also note that a single
quoted string must be separated from a preceding word by a space, since
single quote is a valid character in an identifier. *Note Packages::,
for more info.
Two special literals are `__LINE__' and `__FILE__', which represent
the current line number and filename at that point in your program.
They may only be used as separate tokens; they will not be interpolated
into strings. In addition, the token `__END__' may be used to indicate
the logical end of the script before the actual end of file. Any
following text is ignored, but may be read via the `DATA' filehandle.
(The `DATA' filehandle may read data only from the main script, but not
from any required file or evaluated string.) The two control characters
D' and Z' are synonyms for `__END__'.
A word that doesn't have any other interpretation in the grammar
will be treated as if it had single quotes around it. For this
purpose, a word consists only of alphanumeric characters and underline,
and must start with an alphabetic character. As with filehandles and
labels, a bare word that consists entirely of lowercase letters risks
conflict with future reserved words, and if you use the `-w' switch,
*perl* will warn you about any such words.
Array values are interpolated into double-quoted strings by joining
all the elements of the array with the delimiter specified in the `$"'
variable, space by default. (Since in versions of perl prior to 3.0 the
`@' character was not a metacharacter in double-quoted strings, the
interpolation of `@array', `$array[EXPR]', `@array[LIST]',
`$array{EXPR}', or `@array{LIST}' only happens if array is referenced
elsewhere in the program or is predefined.) The following are
equivalent:
$temp = join($",@ARGV);
system "echo $temp";
system "echo @ARGV";
Within search patterns (which also undergo double-quotish
substitution) there is a bad ambiguity: Is `/$foo[bar]/' to be
interpreted as `/${foo}[bar]/' (where `[bar]' is a character class for
the regular expression) or as `/${foo[bar]}/' (where `[bar]' is the
subscript to array `@foo')? If `@foo' doesn't otherwise exist, then
it's obviously a character class. If `@foo' exists, perl takes a good
guess about `[bar]', and is almost always right. If it does guess
wrong, or if you're just plain paranoid, you can force the correct
interpretation with curly brackets as above.
A line-oriented form of quoting is based on the shell here-is syntax.
Following a `<<' you specify a string to terminate the quoted material,
and all lines following the current line down to the terminating string
are the value of the item. The terminating string may be either an
identifier (a word), or some quoted text. If quoted, the type of
quotes you use determines the treatment of the text, just as in regular
quoting. An unquoted identifier works like double quotes. There must
be no space between the `<<' and the identifier. (If you put a space
it will be treated as a null identifier, which is valid, and matches
the first blank line--see Merry Christmas example below.) The
terminating string must appear by itself (unquoted and with no
surrounding whitespace) on the terminating line.
print <<EOF; # same as above
The price is $Price.
EOF
print <<"EOF"; # same as above
The price is $Price.
EOF
print << x 10; # null identifier is delimiter
Merry Christmas!
print <<`EOC`; # execute commands
echo hi there
echo lo there
EOC
print <<foo, <<bar; # you can stack them
I said foo.
foo
I said bar.
bar
Array literals are denoted by separating individual values by
commas, and enclosing the list in parentheses:
(LIST)
In a context not requiring an array value, the value of the array
literal is the value of the final element, as in the C comma operator.
For example,
@foo = ('cc', '-E', $bar);
assigns the entire array value to array FOO, but
$foo = ('cc', '-E', $bar);
assigns the value of variable BAR to variable FOO. Note that the value
of an actual array in a scalar context is the length of the array; the
following assigns to `$foo' the value 3:
@foo = ('cc', '-E', $bar);
$foo = @foo; # $foo gets 3
You may have an optional comma before the closing parenthesis of an
array literal, so that you can say:
@foo = (
1,
2,
3,
);
When a LIST is evaluated, each element of the list is evaluated in
an array context, and the resulting array value is interpolated into
LIST just as if each individual element were a member of LIST. Thus
arrays lose their identity in a LIST--the list
(@foo,@bar,&SomeSub)
contains all the elements of `@foo' followed by all the elements of
`@bar', followed by all the elements returned by the subroutine named
`SomeSub'.
A list value may also be subscripted like a normal array. Examples:
$time = (stat($file))[8]; # stat returns array value
$digit = ('a','b','c','d','e','f')[$digit-10];
return (pop(@foo),pop(@foo))[0];
Array lists may be assigned to *if and only if* each element of the
list is an lvalue:
($a, $b, $c) = (1, 2, 3);
($map{'red'}, $map{'blue'}, $map{'green'}) = (0x00f, 0x0f0, 0xf00);
The final element may be an array or an associative array:
($a, $b, @rest) = split;
local($a, $b, %rest) = @_;
You can actually put an array anywhere in the list, but the first array
in the list will soak up all the values, and anything after it will get
a null value. This may be useful in a `local()'.
An associative array literal contains pairs of values to be interpreted
as a key and a value:
# same as map assignment above
%map = ('red',0x00f,'blue',0x0f0,'green',0xf00);
Array assignment in a scalar context returns the number of elements
produced by the expression on the right side of the assignment:
$x = (($foo,$bar) = (3,2,1)); # set $x to 3, not 2
There are several other pseudo-literals that you should know about.
If a string is enclosed by backticks (grave accents), it first undergoes
variable substitution just like a double quoted string. It is then
interpreted as a command, and the output of that command is the value of
the pseudo-literal, like in a shell. In a scalar context, a single
string consisting of all the output is returned. In an array context,
an array of values is returned, one for each line of output. (You can
set `$/' to use a different line terminator.) The command is executed
each time the pseudo-literal is evaluated. The status value of the
command is returned in `$?' (*Note Predefined Names::, for the
interpretation of `$?'). Unlike in `csh', no translation is done on
the return data--newlines remain newlines. Unlike in any of the
shells, single quotes do not hide variable names in the command from
interpretation. To pass a `$' through to the shell you need to hide it
with a backslash.
Evaluating a filehandle in angle brackets yields the next line from
that file (newline included, so it's never false until EOF, at which
time the undefined value is returned). Ordinarily you must assign that
value to a variable, but there is one situation where an automatic
assignment happens. If (and only if) the input symbol is the only
thing inside the conditional of a `while' loop, the value is
automatically assigned to the variable `$_'. (This may seem like an
odd thing to you, but you'll use the construct in almost every *perl*
script you write.) Anyway, the following lines are equivalent to each
other:
while ($_ = <STDIN>) { print; }
while (<STDIN>) { print; }
for (;<STDIN>;) { print; }
print while $_ = <STDIN>;
print while <STDIN>;
The filehandles `STDIN', `STDOUT' and `STDERR' are predefined. (The
filehandles `stdin', `stdout' and `stderr' will also work except in
packages, where they would be interpreted as local identifiers rather
than global.) Additional filehandles may be created with the `open'
function.
If a `<FILEHANDLE>' is used in a context that is looking for an
array, an array consisting of all the input lines is returned, one line
per array element. It's easy to make a LARGE data space this way, so
use with care.
The null filehandle `<>' is special and can be used to emulate the
behavior of `sed' and `awk'. Input from `<>' comes either from
standard input, or from each file listed on the command line. Here's
how it works: the first time `<>' is evaluated, the `ARGV' array is
checked, and if it is null, `$ARGV[0]' is set to `-', which when opened
gives you standard input. The `ARGV' array is then processed as a list
of filenames. The loop
while (<>) {
... # code for each line
}
is equivalent to the following Perl-like pseudo code:
unshift(@ARGV, '-') if $#ARGV < $[;
while ($ARGV = shift) {
open(ARGV, $ARGV);
while (<ARGV>) {
... # code for each line
}
}
except that it isn't as cumbersome to say, and will actually work. It
really does shift array `ARGV' and put the current filename into
variable `ARGV'. It also uses filehandle `ARGV' internally--`<>' is
just a synonym for `<ARGV>', which is magical. (The pseudo code above
doesn't work because it treats `<ARGV>' as non-magical.)
You can modify `@ARGV' before the first `<>' as long as the array
ends up containing the list of filenames you really want. Line numbers
(`$.') continue as if the input was one big happy file. (But see
example under `eof' for how to reset line numbers on each file.)
If you want to set `@ARGV' to your own list of files, go right
ahead. If you want to pass switches into your script, you can put a
loop on the front like this:
while ($_ = $ARGV[0], /^-/) {
shift;
last if /^--$/;
/^-D(.*)/ && ($debug = $1);
/^-v/ && $verbose++;
... # other switches
}
while (<>) {
... # code for each line
}
The `<>' symbol will return FALSE only once. If you call it again
after this it will assume you are processing another `@ARGV' list, and
if you haven't set `@ARGV', will input from `STDIN'.
If the string inside the angle brackets is a reference to a scalar
variable (e.g. `<$foo>'), then that variable contains the name of the
filehandle to input from.
If the string inside angle brackets is not a filehandle, it is
interpreted as a filename pattern to be globbed, and either an array of
filenames or the next filename in the list is returned, depending on
context. One level of `$' interpretation is done first, but you can't
say `<$foo>' because that's an indirect filehandle as explained in the
previous paragraph. You could insert curly brackets to force
interpretation as a filename glob: `<${foo}>'. Example:
while (<*.c>) {
chmod 0644, $_;
}
is equivalent to
open(foo, "echo *.c | tr -s ' \t\r\f' '\\012\\012\\012\\012'|");
while (<foo>) {
chop;
chmod 0644, $_;
}
In fact, it's currently implemented that way. (Which means it will
not work on filenames with spaces in them unless you have `/bin/csh' on
your machine.) Of course, the shortest way to do the above is:
chmod 0644, <*.c>;
File: perl.info, Node: Syntax, Next: Compound Statements, Prev: Data Types, Up: Top
Syntax
******
A *perl* script consists of a sequence of declarations and commands.
The only things that need to be declared in *perl* are report formats
and subroutines. See the sections below for more information on those
declarations. All uninitialized user-created objects are assumed to
start with a null or 0 value until they are defined by some explicit
operation such as assignment. The sequence of commands is executed
just once, unlike in `sed' and `awk' scripts, where the sequence of
commands is executed for each input line. While this means that you
must explicitly loop over the lines of your input file (or files), it
also means you have much more control over which files and which lines
you look at. (Actually, I'm lying--it is possible to do an implicit
loop with either the `-n' or `-p' switch.)
A declaration can be put anywhere a command can, but has no effect on
the execution of the primary sequence of commands--declarations all
take effect at compile time. Typically all the declarations are put at
the beginning or the end of the script.
*Perl* is, for the most part, a free-form language. (The only
exception to this is format declarations, for fairly obvious reasons.)
Comments are indicated by the `#' character, and extend to the end of
the line. If you attempt to use `/* */' C comments, it will be
interpreted either as division or pattern matching, depending on the
context. So don't do that.
File: perl.info, Node: Compound Statements, Next: Simple Statements, Prev: Syntax, Up: Top
Compound Statements
*******************
In *perl*, a sequence of commands may be treated as one command by
enclosing it in curly brackets. We will call this a BLOCK.
The following compound commands may be used to control flow:
if (EXPR) BLOCK
if (EXPR) BLOCK else BLOCK
if (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK
LABEL while (EXPR) BLOCK
LABEL while (EXPR) BLOCK continue BLOCK
LABEL for (EXPR; EXPR; EXPR) BLOCK
LABEL foreach VAR (ARRAY) BLOCK
LABEL BLOCK continue BLOCK
Note that, unlike C and Pascal, these are defined in terms of BLOCKs,
not statements. This means that the curly brackets are *required*--no
dangling statements allowed. If you want to write conditionals without
curly brackets there are several other ways to do it. The following
all do the same thing:
if (!open(foo)) { die "Can't open $foo: $!"; }
die "Can't open $foo: $!" unless open(foo);
open(foo) || die "Can't open $foo: $!"; # foo or bust!
open(foo) ? 'hi mom' : die "Can't open $foo: $!";
# a bit exotic, that last one
The `if' statement is straightforward. Since BLOCKs are always bounded
by curly brackets, there is never any ambiguity about which `if' an
`else' goes with. If you use `unless' in place of `if', the sense of
the test is reversed.
The `while' statement executes the block as long as the expression
is true (does not evaluate to the null string or 0). The LABEL is
optional, and if present, consists of an identifier followed by a colon.
The LABEL identifies the loop for the loop control statements `next',
`last', and `redo' (see below). If there is a `continue' BLOCK, it is
always executed just before the conditional is about to be evaluated
again, similarly to the third part of a `for' loop in C. Thus it can
be used to increment a loop variable, even when the loop has been
continued via the `next' statement (similar to the C `continue'
statement).
If the word `while' is replaced by the word `until', the sense of
the test is reversed, but the conditional is still tested before the
first iteration.
In either the `if' or the `while' statement, you may replace
`(EXPR)' with a BLOCK, and the conditional is true if the value of the
last command in that block is true.
The `for' loop works exactly like the corresponding `while' loop:
for ($i = 1; $i < 10; $i++) {
...
}
is the same as
$i = 1;
while ($i < 10) {
...
} continue {
$i++;
}
The `foreach' loop iterates over a normal array value and sets the
variable VAR to be each element of the array in turn. The variable is
implicitly local to the loop, and regains its former value upon exiting
the loop. The `foreach' keyword is actually identical to the `for'
keyword, so you can use `foreach' for readability or `for' for brevity.
If VAR is omitted, `$_' is set to each value. If ARRAY is an actual
array (as opposed to an expression returning an array value), you can
modify each element of the array by modifying VAR inside the loop.
Examples:
for (@ary) { s/foo/bar/; }
foreach $elem (@elements) {
$elem *= 2;
}
for ((10,9,8,7,6,5,4,3,2,1,'BOOM')) {
print $_, "\n"; sleep(1);
}
for (1..15) { print "Merry Christmas\n"; }
foreach $item (split(/:[\\\n:]*/, $ENV{'TERMCAP'})) {
print "Item: $item\n";
}
The BLOCK by itself (labeled or not) is equivalent to a loop that
executes once. Thus you can use any of the loop control statements in
it to leave or restart the block. The `continue' block is optional.
This construct is particularly nice for doing case structures.
foo: {
if (/^abc/) { $abc = 1; last foo; };
if (/^def/) { $def = 1; last foo; };
if (/^xyz/) { $xyz = 1; last foo; };
$nothing = 1;
}
There is no official switch statement in perl, because there are
already several ways to write the equivalent. In addition to the
above, you could write:
foo: {
$abc = 1, last foo if /^abc/;
$def = 1, last foo if /^def/;
$xyz = 1, last foo if /^xyz/;
$nothing = 1;
}
or
foo: {
/^abc/ && do { $abc = 1; last foo; }
/^def/ && do { $def = 1; last foo; }
/^xyz/ && do { $xyz = 1; last foo; }
$nothing = 1;
}
or
foo: {
/^abc/ && ($abc = 1, last foo);
/^def/ && ($def = 1, last foo);
/^xyz/ && ($xyz = 1, last foo);
$nothing = 1;
}
or even
if (/^abc/)
{ $abc = 1; }
elsif (/^def/)
{ $def = 1; }
elsif (/^xyz/)
{ $xyz = 1; }
else
{$nothing = 1;}
As it happens, these are all optimized internally to a switch
structure, so perl jumps directly to the desired statement, and you
needn't worry about perl executing a lot of unnecessary statements when
you have a string of 50 `elsif's, as long as you are testing the same
simple scalar variable using `==', `eq', or pattern matching as above.
(If you're curious as to whether the optimizer has done this for a
particular case statement, you can use the `-D1024' switch to list the
syntax tree before execution.)
File: perl.info, Node: Simple Statements, Next: Expressions, Prev: Compound Statements, Up: Top
Simple Statements
*****************
The only kind of simple statement is an expression evaluated for its
side effects. Every simple statement must be terminated with a
semicolon, unless it is the final statement in a block, in which case
the semicolon is optional. (Semicolon is still encouraged there if the
block takes up more than one line).
Any simple statement may optionally be followed by a single modifier,
just before the terminating semicolon. The possible modifiers are:
if EXPR
unless EXPR
while EXPR
until EXPR
The `if' and `unless' modifiers have the expected semantics. The
`while' and `until' modifiers also have the expected semantics
(conditional evaluated first), except when applied to a do-BLOCK or a
do-SUBROUTINE command, in which case the block executes once before the
conditional is evaluated. This is so that you can write loops like:
do {
$_ = <STDIN>;
...
} until $_ eq ".\n";
(See the `do' operator below. Note also that the loop control commands
described later will *NOT* work in this construct, since modifiers
don't take loop labels. Sorry.)
File: perl.info, Node: Expressions, Next: Commands, Prev: Simple Statements, Up: Top
Expressions
***********
Since *perl* expressions work almost exactly like C expressions,
only the differences will be mentioned here.
Here's what *perl* has that C doesn't:
**
The exponentiation operator.
**=
The exponentiation assignment operator.
()
The null list, used to initialize an array to null.
.
Concatenation of two strings.
.=
The concatenation assignment operator.
eq
String equality (`==' is numeric equality). For a mnemonic just
think of `eq' as a string. (If you are used to the `awk' behavior
of using `==' for either string or numeric equality based on the
current form of the comparands, beware! You must be explicit
here.)
ne
String inequality (`!=' is numeric inequality).
lt
String less than.
gt
String greater than.
le
String less than or equal.
ge
String greater than or equal.
cmp
String comparison, returning -1, 0, or 1.
<=>
Numeric comparison, returning -1, 0, or 1.
=~
Certain operations search or modify the string `$_' by default.
This operator makes that kind of operation work on some other
string. The right argument is a search pattern, substitution, or
translation. The left argument is what is supposed to be
searched, substituted, or translated instead of the default `$_'.
The return value indicates the success of the operation. (If the
right argument is an expression other than a search pattern,
substitution, or translation, it is interpreted as a search
pattern at run time. This is less efficient than an explicit
search, since the pattern must be compiled every time the
expression is evaluated.) The precedence of this operator is lower
than unary minus and autoincrement/decrement, but higher than
everything else.
!~
Just like `=~' except the return value is negated.
x
The repetition operator. Returns a string consisting of the left
operand repeated the number of times specified by the right
operand. In an array context, if the left operand is a list in
parens, it repeats the list.
print '-' x 80; # print row of dashes
print '-' x80; # illegal, x80 is identifier
print "\t" x ($tab/8), ' ' x ($tab%8); # tab over
@ones = (1) x 80; # an array of 80 1's
@ones = (5) x @ones; # set all elements to 5
x=
The repetition assignment operator. Only works on scalars.
..
The range operator, which is really two different operators
depending on the context. In an array context, returns an array
of values counting (by ones) from the left value to the right
value. This is useful for writing `for (1..10)' loops and for
doing slice operations on arrays.
In a scalar context, `..' returns a boolean value. The operator is
bistable, like a flip-flop, and emulates the line-range (comma)
operator of `sed', `awk', and various editors. Each `..' operator
maintains its own boolean state. It is false as long as its left
operand is false. Once the left operand is true, the range
operator stays true until the right operand is true, *AFTER* which
the range operator becomes false again. (It doesn't become false
till the next time the range operator is evaluated. It can test
the right operand and become false on the same evaluation it
became true (as in `awk'), but it still returns true once. If you
don't want it to test the right operand till the next evaluation
(as in `sed'), use three dots (...) instead of two.) The right
operand is not evaluated while the operator is in the "false"
state, and the left operand is not evaluated while the operator is
in the "true" state. The precedence is a little lower than `||'
and `&&'. The value returned is either the null string for false,
or a sequence number (beginning with 1) for true. The sequence
number is reset for each range encountered. The final sequence
number in a range has the string `E0' appended to it, which
doesn't affect its numeric value, but gives you something to
search for if you want to exclude the endpoint. You can exclude
the beginning point by waiting for the sequence number to be
greater than 1. If either operand of scalar `..' is static, that
operand is implicitly compared to the `$.' variable, the current
line number. Examples:
As a scalar operator:
if (101 .. 200) { print; } # print 2nd hundred lines
next line if (1 .. /^$/); # skip header lines
s/^/> / if (/^$/ .. eof()); # quote body
As an array operator:
for (101 .. 200) { print; } # print $_ 100 times
@foo = @foo[$[ .. $#foo]; # an expensive no-op
@foo = @foo[$#foo-4 .. $#foo]; # slice last 5 items
-x
A file test. This unary operator takes one argument, either a
filename or a filehandle, and tests the associated file to see if
something is true about it. If the argument is omitted, tests
`$_', except for `-t', which tests `STDIN'. It returns 1 for true
and '' for false, or the undefined value if the file doesn't
exist. Precedence is higher than logical and relational
operators, but lower than arithmetic operators. The operator may
be any of:
-r File is readable by effective uid/gid.
-w File is writable by effective uid/gid.
-x File is executable by effective uid/gid.
-o File is owned by effective uid.
-R File is readable by real uid/gid.
-W File is writable by real uid/gid.
-X File is executable by real uid/gid.
-O File is owned by real uid.
-e File exists.
-z File has zero size.
-s File has non-zero size (returns size).
-f File is a plain file.
-d File is a directory.
-l File is a symbolic link.
-p File is a named pipe (FIFO).
-S File is a socket.
-b File is a block special file.
-c File is a character special file.
-u File has setuid bit set.
-g File has setgid bit set.
-k File has sticky bit set.
-t Filehandle is opened to a tty.
-T File is a text file.
-B File is a binary file (opposite of -T).
-M Age of file in days when script started.
-A Same for access time.
-C Same for inode change time.
The interpretation of the file permission operators `-r', `-R',
`-w', `-W', `-x' and `-X' is based solely on the mode of the file
and the uids and gids of the user. There may be other reasons you
can't actually read, write or execute the file. Also note that,
for the superuser, `-r', `-R', `-w' and `-W' always return 1, and
`-x' and `-X' return 1 if any execute bit is set in the mode.
Scripts run by the superuser may thus need to do a `stat()' in
order to determine the actual mode of the file, or temporarily set
the uid to something else.
Example:
while (<>) {
chop;
next unless -f $_; # ignore specials
...
}
Note that `-s/a/b/' does not do a negated substitution. Saying
`-exp($foo)' still works as expected, however--only single letters
following a minus are interpreted as file tests.
The `-T' and `-B' switches work as follows. The first block or so
of the file is examined for odd characters such as strange control
codes or metacharacters. If too many odd characters (>10%) are
found, it's a `-B' file, otherwise it's a `-T' file. Also, any
file containing null in the first block is considered a binary
file. If `-T' or `-B' is used on a filehandle, the current stdio
buffer is examined rather than the first block. Both `-T' and `-B'
return TRUE on a null file, or a file at EOF when testing a
filehandle.
If any of the file tests (or either `stat' operator) are given the
special filehandle consisting of a solitary underline `_', then the
stat structure of the previous file test (or `stat' operator) is
used, saving a system call. (This doesn't work with `-t', and you
need to remember that `lstat' and `-l' will leave values in the
stat structure for the symbolic link, not the real file.) Example:
print "Can do.\n" if -r $a || -w _ || -x _;
stat($filename);
print "Readable\n" if -r _;
print "Writable\n" if -w _;
print "Executable\n" if -x _;
print "Setuid\n" if -u _;
print "Setgid\n" if -g _;
print "Sticky\n" if -k _;
print "Text\n" if -T _;
print "Binary\n" if -B _;
Here is what C has that *perl* doesn't:
unary &
Address-of operator.
unary *
Dereference-address operator.
(TYPE)
Type casting operator.
Like C, *perl* does a certain amount of expression evaluation at
compile time, whenever it determines that all of the arguments to an
operator are static and have no side effects. In particular, string
concatenation happens at compile time between literals that don't do
variable substitution. Backslash interpretation also happens at compile
time. You can say:
'Now is the time for all' . "\n" .
'good men to come to.'
and this all reduces to one string internally.
The autoincrement operator has a little extra built-in magic to it.
If you increment a variable that is numeric, or that has ever been used
in a numeric context, you get a normal increment. If, however, the
variable has only been used in string contexts since it was set, and has
a value that is not null and matches the pattern `/^[a-zA-Z]*[0-9]*$/',
the increment is done as a string, preserving each character within its
range, with carry:
print ++($foo = '99'); # prints `100'
print ++($foo = 'a0'); # prints `a1'
print ++($foo = 'Az'); # prints `Ba'
print ++($foo = 'zz'); # prints `aaa'
The autodecrement is not magical.
The range operator (in an array context) makes use of the magical
autoincrement algorithm if the minimum and maximum are strings. You can
say
@alphabet = ('A' .. 'Z');
to get all the letters of the alphabet, or
$hexdigit = (0 .. 9, 'a' .. 'f')[$num & 15];
to get a hexadecimal digit, or
@z2 = ('01' .. '31'); print @z2[$mday];
to get dates with leading zeros. (If the final value specified is not
in the sequence that the magical increment would produce, the sequence
goes until the next value would be longer than the final value
specified.)
The `||' and `&&' operators differ from C's in that, rather than
returning 0 or 1, they return the last value evaluated. Thus, a
portable way to find out the home directory might be:
$home = $ENV{'HOME'} || $ENV{'LOGDIR'} ||
(getpwuid($<))[7] || die "You're homeless!\en";
Along with the literals and variables mentioned earlier, the
operations in the following section can serve as terms in an
expression. Some of these operations take a LIST as an argument. Such
a list can consist of any combination of scalar arguments or array
values; the array values will be included in the list as if each
individual element were interpolated at that point in the list, forming
a longer single-dimensional array value. Elements of the LIST should be
separated by commas. If an operation is listed both with and without
parentheses around its arguments, it means you can either use it as a
unary operator or as a function call. To use it as a function call, the
next token on the same line must be a left parenthesis. (There may be
intervening white space.) Such a function then has highest precedence,
as you would expect from a function. If any token other than a left
parenthesis follows, then it is a unary operator, with a precedence
depending only on whether it is a LIST operator or not. LIST operators
have lowest precedence. All other unary operators have a precedence
greater than relational operators but less than arithmetic operators.
*Note Precedence::, for more info.
For operators that can be used in either a scalar or array context,
failure is generally indicated in a scalar context by returning the
undefined value, and in an array context by returning the null list.
Remember though that *THERE IS NO GENERAL RULE FOR CONVERTING A LIST
INTO A SCALAR.* Each operator decides which sort of scalar it would be
most appropriate to return. Some operators return the length of the
list that would have been returned in an array context. Some operators
return the first value in the list. Some operators return the last
value in the list. Some operators return a count of successful
operations. In general, they do what you want, unless you want
consistency.
File: perl.info, Node: Commands, Next: Precedence, Prev: Expressions, Up: Top
Commands
********
* Menu:
* Math Functions:: Various trigonometric and math functions.
* Structure Conversion:: How to convert binary structures.
* String Functions:: Functions to interact with strings.
* Array and List Functions:: Functions that manipulate arrays/lists.
* File Operations:: Functions that operate on files.
* Directory Reading Functions:: Functions for reading directories. :-)
* Input/Output:: Printing and reading data.
* Search and Replace Functions:: Pattern matching functions.
* System Interaction:: A mix of functions dealing with the system.
* Networking Functions:: Interprocess Communication Functions.
* System V IPC:: System V IPC Functions.
* Time Functions:: Time related functions.
* DBM Functions:: Functions for accessing `dbm' files.
* Flow Control Functions:: Functions related to flow control.
* Perl Library Functions:: How to include perl libraries.
* Subroutine Functions:: Functions related to user-defined subs.
* Variable Functions:: Functions dealing with variables.
(not already mentioned)
* Miscellaneous Functions:: A catch-all for all other functions. ;-)
File: perl.info, Node: Math Functions, Next: Structure Conversion, Up: Commands
Math Functions
==============
atan2(Y,X)
Returns the arctangent of Y/X in the range -PI to PI.
cos(EXPR)
cos EXPR
cos
Returns the cosine of EXPR (expressed in radians). If EXPR is
omitted takes cosine of `$_'.
exp(EXPR)
exp EXPR
exp
Returns `e' to the power of EXPR. If EXPR is omitted, gives
`exp($_)'.
hex(EXPR)
hex EXPR
hex
Returns the decimal value of EXPR interpreted as an hex string.
(To interpret strings that might start with `0' or `0x' see
`oct()'.) If EXPR is omitted, uses `$_'.
int(EXPR)
int EXPR
int
Returns the integer portion of EXPR. If EXPR is omitted, uses
`$_'.
log(EXPR)
log EXPR
log
Returns logarithm (base `e') of EXPR. If EXPR is omitted, returns
log of `$_'.
oct(EXPR)
oct EXPR
oct
Returns the decimal value of EXPR interpreted as an octal string.
(If EXPR happens to start off with `0x', interprets it as a hex
string instead.) The following will handle decimal, octal and hex
in the standard notation:
$val = oct($val) if $val =~ /^0/;
If EXPR is omitted, uses `$_'.
sin(EXPR)
sin EXPR
sin
Returns the sine of EXPR (expressed in radians). If EXPR is
omitted, returns sine of `$_'.
sqrt(EXPR)
sqrt EXPR
sqrt
Return the square root of EXPR. If EXPR is omitted, returns
square root of `$_'.
File: perl.info, Node: Structure Conversion, Next: String Functions, Prev: Math Functions, Up: Commands
Structure Conversion
====================
pack(TEMPLATE,LIST)
Takes an array or list of values and packs it into a binary
structure, returning the string containing the structure. The
TEMPLATE is a sequence of characters that give the order and type
of values, as follows:
A An ascii string, will be space padded.
a An ascii string, will be null padded.
c A signed char value.
C An unsigned char value.
s A signed short value.
S An unsigned short value.
i A signed integer value.
I An unsigned integer value.
l A signed long value.
L An unsigned long value.
n A short in `network' order.
N A long in `network' order.
f A single-precision float in the native format.
d A double-precision float in the native format.
p A pointer to a string.
v A short in `VAX' (little-endian) order.
V A long in `VAX' (little-endian) order.
x A null byte.
X Back up a byte.
@ Null fill to absolute position.
u A uuencoded string.
b A bit string (ascending bit order, like vec()).
B A bit string (descending bit order).
h A hex string (low nybble first).
H A hex string (high nybble first).
Each letter may optionally be followed by a number which gives a
repeat count. With all types except `a', `A', `b', `B', `h', and
`H', the pack function will gobble up that many values from the
LIST. A `*' for the repeat count means to use however many items
are left. The `a' and `A' types gobble just one value, but pack
it as a string of length count, padding with nulls or spaces as
necessary. (When unpacking, `A' strips trailing spaces and nulls,
but `a' does not.) Likewise, the `b' and `B' fields pack a string
that many bits long. The `h' and `H' fields pack a string that
many nybbles long. Real numbers (floats and doubles) are in the
native machine format only; due to the multiplicity of floating
formats around, and the lack of a standard "network"
representation, no facility for interchange has been made. This
means that packed floating point data written on one machine may
not be readable on another - even if both use IEEE floating point
arithmetic (as the endian-ness of the memory representation is not
part of the IEEE spec). Note that perl uses doubles internally
for all numeric calculation, and converting from double to float
back to double will lose precision (i.e. `unpack("f", pack("f",
$foo))' will not in general equal `$foo').
Examples:
$foo = pack("cccc",65,66,67,68);
# foo eq "ABCD"
$foo = pack("c4",65,66,67,68);
# same thing
$foo = pack("ccxxcc",65,66,67,68);
# foo eq "AB\0\0CD"
$foo = pack("s2",1,2);
# "\1\0\2\0" on little-endian
# "\0\1\0\2" on big-endian
$foo = pack("a4","abcd","x","y","z");
# "abcd"
$foo = pack("aaaa","abcd","x","y","z");
# "axyz"
$foo = pack("a14","abcdefg");
# "abcdefg\0\0\0\0\0\0\0"
$foo = pack("i9pl", gmtime);
# a real struct tm (on my system anyway)
sub bintodec {
unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
}
The same template may generally also be used in the `unpack'
function.
unpack(TEMPLATE,EXPR)
`unpack' does the reverse of `pack': it takes a string
representing a structure and expands it out into an array value,
returning the array value. (In a scalar context, it merely
returns the first value produced.) The TEMPLATE has the same
format as in the `pack' function. Here's a subroutine that does
substring:
sub substr {
local($what,$where,$howmuch) = @_;
unpack("x$where a$howmuch", $what);
}
and then there's
sub ord { unpack("c",$_[0]); }
In addition, you may prefix a field with a `%<number>' to indicate
that you want a <number>-bit checksum of the items instead of the
items themselves. Default is a 16-bit checksum. For example, the
following computes the same number as the System V sum program:
while (<>) {
$checksum += unpack("%16C*", $_);
}
$checksum %= 65536;