Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
93 views

Perl Syntax: Basic Script

Perl Syntax provides an overview of the basic elements of the Perl programming language including: 1) Basic scripts, data types like scalars, arrays, hashes and references. 2) Conditionals like if/else statements and logical operators. 3) Loops and iterations including for, foreach, while and until loops. 4) Functions with arguments, return values, and function prototypes. 5) Regular expressions for pattern matching, substitution and splitting strings.
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
93 views

Perl Syntax: Basic Script

Perl Syntax provides an overview of the basic elements of the Perl programming language including: 1) Basic scripts, data types like scalars, arrays, hashes and references. 2) Conditionals like if/else statements and logical operators. 3) Loops and iterations including for, foreach, while and until loops. 4) Functions with arguments, return values, and function prototypes. 5) Regular expressions for pattern matching, substitution and splitting strings.
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 9

Perl Syntax

[Basic Script]
[Data Types]
[Conditionals]
[Loops and Iterations]
[Functions]
[Regular Expressions]
[Special Variables]
[Standard IO]
[Useful Functions and Keywords]
other languages..

Basic Script
#############################################################################
#
# name: main
# purpose: entry point of the script
#############################################################################
#

# @ARGV holds all script command line arguments (pos 0 is not prog-name)
# $0 holds script filename
print "hello world\n";

Data Types
#############################################################################
#
# name: main
# purpose: show the basic datatypes
#############################################################################
#

### scalars (ints, floats, strings)


$float = 3.14; # can hold real / whole numbers
$false = 0; # 0 counts as FALSE, non-zero is TRUE
$str = "hello"; # can hold strings
$false2 = ""; # en empty string is FALSE of course
$false3 = '0'; # "0" also counts as FALSE, all other strings are TRUE
undef $num; # similar to NULL, counts as FALSE
$line = "hello\n"; # $line holds 'hello' and then a new-line (LF) - 6
chars
$firm = 'hello\n'; # $firm holds the text 'hello\n' - 7 chars
$ten_a = 'a' x 10; # $ten_a holds 'aaaaaaaaaa'
$long1 = <<"END1"; # long text with a few lines - as a "" string
This is long text,
With $float lines.
END1
$long2 = <<'END2'; # long text with a few lines - as a '' string
This can hold \n.
END2

# scalar operations
$num = $num*2 + 3 - $float; # $num is 23.86
$num = 2**4 % 5; # $num is 1 - exp then modulus
$num++; # $num is 2 - inc after eval
$ms = (1<< 3)&0xff|0x03^0x01; # $ms is 0x0a
print ++($foo = '99'); # prints '100' - inc before eval
$new = $str." world"; # $new is "hello world"

### arrays (lists of scalars)


@nums = (1,2,3);
@strings = ("one",$str); # @strings is ("one","hello")
@mixed = ("three",3.13); # any scalar can be placed in a list
@empty = (); # empty list counts as FALSE, non-empty is TRUE
($one,$two) = (1,2); # $one is 1, $two is 2
@to_ten = (1,2,3..10); # 3..10 is a list of all nums from 3 to 10

# array operations
$first = $nums[0]; # $first is 1
$strings[1] = "neo"; # @strings is ("one","neo")
$mixed[2] = 37; # @mixed is ("three",3.13,37) - grows automatically
@joined = (@mixed,8); # @joined is ("three",3.13,37,8)
@sl = @nums[0,-1,1]; # @sl is (1,3,2) - array slice (specific indices)
@sl = @nums[0..2]; # @sl is (1,2,3) - array slice (span)
$len = scalar(@nums); # an array in scalar context is the list length (3)
$last_index = $#nums; # $last_index is 2 (the last index in the list)
$#nums = -1; # @nums is () - empty

### hashes (maps of keys and values)


%ages = ("jim"=>18,"ted"=>21); # the key "jim" has a value of 18
%same = ("jim",18,"ted",21); # => is exactly like ,
%mix_hash = (1=>"bla","hi"=>22.1); # any scalar can be a key or value
%empty_hash = (); # empty hash counts as FALSE, full is
TRUE

# hash operations
$jims_age = $ages{"jim"}; # $jims_age is 18
$ages{"jim"}++; # key "jim" has value of 19 in %ages
$ages{"ron"} = 24; # key "ron" with value 24 added to %ages
@sl = @ages{"ted","ron"}; # @sl is (21,24) - hash slice
$stats = scalar(%ages); # string eg. "1/16" - 1 used bucket out of 16
alloced

### references (scalar that holds a pointer to another type)


$scalarref = \$num;
$arrayref = \@mixed;
$hashref = \%ages;

# reference operations
$num_copy = $$scalarref; # dereference using {type}$reference
@mixed_copy = @$arrayref;
$value = $$hashref{"jim"};
$value = $arrayref->[0]; # or dereference using $reference->
$value = $hashref->{"jim"};

Conditionals
#############################################################################
#
# name: main
# purpose: show the basic conditionals
#############################################################################
#

# regular c style if statement, must use blocks


if (defined($value) && ($value == 1)) # defined() tests for
undef
{
print "value equals 1\n";
}

# if-else, must use blocks


if (($job eq "millionaire") || ($state ne "dead")) # eq,ne are used for
strings
{
print "a suitable husband found\n";
}
else
{
print "not suitable\n";
}

# unless is the opposite of if, must use blocks


unless (($age >= 18) and ($age < 80)) # and,or,not are also ok
{
print "too old\n";
}

# short forms (no blocks needed if a single statement comes before)


print "ok" if $ok;
print "ok" unless not $ok;

# and the true perl way


open(FILE) or die "cant open file";

Loops and Iterations


#############################################################################
#
# name: main
# purpose: show the flow blocks
#############################################################################
#

# for (regular c style), must use a block


for ($i=0; $i<10; $i++)
{
print "iteration number $i\n";
}

# foreach (iterate on lists), must use blocks


foreach $num (@numbers) # $num hold a member in each iteration
{
print "$num";
}
foreach (@numbers) # if excluded, the member is stored in $_
{
print; # by default, $_ is printed
}
for (1..10) { print "a"; } # 'foreach' is actually a synonym for
'for'

# while / until statements, must use blocks


$i = 0;
while ($i < 10) # enter block if condition is TRUE
{
print "iteration number $i\n";
$i++;
}
until ($i == 0) # enter block if condition is FALSE
{
$i--;
print "back to $i\n";
}

# do while / until just like in c, must use blocks


$i = 0;
do
{
print "this will print\n"; # enter block once before evaluating
} while ($i != 0);
do
{
print "this too\n";
} until ($i == 0);

# short forms (no blocks needed if a single statement comes before)


print "a" for (1..10);
read_next_line() while not end_of_file();
read_next_line() until end_of_file();

# next and last statements are similar to c continue and break


for ($i=0; $i<10; $i++)
{
next if ($i == 3); # skip printing 3 (go to next iteration)
last if ($i == 5); # exit the loop before printing 5
print $i; # will print 0124
}
Functions
#############################################################################
#
# name: main
# purpose: show function and subroutine syntax
#############################################################################
#

# return values
sub seventeen1 # return keyword indicated return value
{
return 17;
}
sub seventeen2 # if no return exists, retval is the last
expression
{
17;
}
$num = seventeen1() + seventeen2() + 53;
sub retlist # all datatypes can be returned
{
return (1,2,3);
}
($one,$two,$thr) = retlist; # () are optional (even when we have args)

# arguments
sub has_args
{
@func_arguments = @_; # all arguments are members of the list @_
$first_arg = $_[0]; # returns undef if no arg given
($arg1,$arg2,$arg3) = @_; # the common perl way to handle function
arguments
}
has_args($num,@l1,22,@l2); # all arguments are flattened into one list
sub takes_two_lists # to pass several lists / hashes, use references
{
($l1ref,$l2ref) = @_;
@list1 = @$l1ref;
}
takes_two_lists(\@a,\@b);

# prototypes (limited compile-time argument checking)


sub two_scalars($$) { }; # two_scalars(12,"hello");
sub scalar_n_list($@) { }; # scalar_n_list("scalar",1,2,3);
sub array_ref(\@) { }; # array_ref(@array);

Regular Expressions
#############################################################################
#
# name: main
# purpose: show regular expression usage
#############################################################################
#

# matching
$call911 = 'Someone, call 911.'; # the string we want to match upon
$found = ($call911 =~ /call/); # $found is TRUE, matched 'call'
@res = ($call911 =~ /Some(...)/); # @res is ('one'), matched 'Someone'
$entire_res = $&; # $entire_res is 'Someone'
$brack1_res = $1; # $brack1_res is 'one', $+ for last
brackets
($entire_pos,$brack1_pos) = @-; # $entire_pos is 0, $brack1_pos is 4
($entire_end,$brack1_end) = @+; # $entire_end is 7, $brack1_end is 7
# global matching (get all found)
$call911 =~ /(.o.)/g; # g is global-match, $1 is 'Som', $2 is
'eon'
@res = ($call911 =~ /(.o.)/g); # @res is ('Som','eon'), $& is 'eon'

# substituting
$greeting = "hello world"; # the string we want to replace in
$greeting =~ s/hello/goodbye/; # $greeting is 'goodbye world'

# splitting
@l = split(/\W+/,$call911); # @l is ('Someone','call','911')
@l = split(/(\W+)/,$call911); # @l is ('Someone',', ','call','
','911','.')

# pattern syntax
$call911 =~ /c.ll/; # . is anything but \n, $& is 'call'
$call911 =~ /c.ll/s; # s is singe-line, . will include \n, $& is 'call'
$call911 =~ /911\./; # \ escapes metachars {}[]()^$.|*+?\, $& is '911.'
$call911 =~ /o../; # matches earliest, $& is 'ome'
$call911 =~ /g?one/; # ? is 0 or 1 times, $& is 'one'
$call911 =~ /cal+/; # + is 1 or more times, $& is 'call', * for 0 or
more
$call911 =~ /cal{2}/; # {2} is exactly 2 times, $& is 'call'
$call911 =~ /cal{0,3}/; # {0,3} is 0 to 3 times, $& is 'call', {2,} for >=
2
$call911 =~ /S.*o/; # matches are greedy, $& is 'Someo'
$call911 =~ /S.*?o/; # ? makes match non-greedy, $& is 'So'
$call911 =~ /^.o/; # ^ must match beginning of line, $& is 'So'
$call911 =~ /....$/; # $ must match end of line, $& is '911.'
$call911 =~ /9[012-9a-z]/;# one of the letters in [...], $& is '91'
$call911 =~ /.o[^m]/; # none of the letters in [^...], $& is 'eon'
$call911 =~ /\d*/; # \d is digit, $& is '911'
$call911 =~ /S\w*/; # \w is word [a-zA-Z0-9_], $& is 'Someone'
$call911 =~ /..e\b/; # \b is word boundry, $& is 'one', \B for non-
boundry
$call911 =~ / \D.../; # \D is non-digit, $& is ' call', \W for non-word
$call911 =~ /\s.*\s/; # \s is whitespace char [\t\n ], $& is ' call '
$call911 =~ /\x39\x31+/; # \x is hex byte, $& is '911'
$call911 =~ /Some(.*),/; # (...) extracts, $1 is 'one', $& is 'Someone,'
$call911 =~ /e(one|two)/; # | means or, $& is 'eone'
$call911 =~ /e(?:one|tw)/;# (?:...) does not extract, $& is 'eone', $1 is
undef
$call911 =~ /(.)..\1/; # \1 is memory of first brackets, $& is 'omeo'
$call911 =~ /some/i; # i is case-insensitive, $& is 'Some'
$call911 =~ /^Some/m; # m is multi-line, ^ will match start of entire
text
$call911 =~ m!call!; # use ! instead of /, no need for \/, $& is 'call'

Special Variables
#############################################################################
#
# name: main
# purpose: show some special internal variables
#############################################################################
#

# $_ - default input
print for (1..10); # in many places, no var will cause work on $_
print $_ for $_ (1..10); # same as above

# $. - current line in last file handle


while (!(<IN> =~ /error/i)) {};
print "first error on line $.\n";

# $/ - input record separator (default is "\n")


undef $/;
$entire = <IN>; # read entire file all at once
$/ = "512";
$chunk = <IN>; # read a chunk of 512 bytes

# $\ - output record separator (default is undef)


$\ = "\n"; # auto \n after print
print 'no need for LF';

# $! - errno / a string description of error


open(FILE) or die "error: $!";

# $@ - errors from last eval


eval $cmd;
print "eval successful" if not $@;

Standard IO
#############################################################################
#
# name: main
# purpose: show some basic IO and file handling
#############################################################################
#

# open a file a la shell


open(IN, "< input.txt") or die "cant open input file: $!";
open(OUT, ">> output.txt") or die "cant open output file: $!";
# binmode(IN) to change IN from txt mode to binary mode
# read records from a file (according to $/)
while ($line = <IN>) # <IN> returns next line, or FALSE if none left
{
# write data to a file
print OUT $line;
}

# cleanup
close(IN);
close(OUT);

# check if file exists


print "$filename exists" if (-e $filename);

# check the file size


print "$filename file size is ".(stat $filename)[7];

# get all the txt files in current directory


@txtfiles = <*.txt>; # perl globbing
@txtfiles = `dir /b *.txt`; # or use the shell (slower), needs chomping

Useful Functions and Keywords


#############################################################################
#
# name: main
# purpose: show some basic functions and keywords of perl
#############################################################################
#

# scalar / string functions


foreach (`dir /b`) { chomp; print; } # chomp removes \n tail (according to
$/)
$ext = chop($file).$ext for (1..3); # chop removes last char and returns it
print 'a is '.chr(ord('a')); # ord converts chr to num, chr is
opposite
print lc("Hello"), uc(" World"); # prints 'hello WORLD'
print length("hello"); # prints '5'
$three_a = sprintf("%08x",58); # just like regular c sprintf
print($type) if ($type = ref $ref); # prints 'SCALAR'/'ARRAY'/'HASH'/'REF'

# regexps and pattern matching functions


print quotemeta('[.]'); # prints '\[\.\]'
@words = split(/W+/,$sentence); # splits a string according to a regexp

# array / list functions


@three_two_one = reverse(1,2,3); # returns a list in reverse
print pop(push(@arr,'at end')); # prints 'at end', no change to @arr
print shift(unshift(@arr,'at start'); # prints 'at start', no change to @arr
@after = grep(!/^\s*#/, @before); # weed out full comment lines
$sentence = join(' ',@words); # turns lists into strings with a delim
print sort <*.*>; # sort string lists in alphabetical
order
delete @arr[3..5]; # deletes the 3rd,4th,5th elements in
@arr
print "length is ".scalar @arr; # scalar evaluates expressions as
scalars

# hash related functions


delete @hash{"key1","key2"}; # deletes these keys from the hash
print $hash{$_} foreach (keys %hash); # prints all hash values by checking
keys
print values(%hash); # same but different

# misc functions and keywords


sleep(10); # causes the script to sleep for 10
secs
exit(0) if $should_quit; # exits the script with a return value
use warnings; use strict; # imports new external modules
no warnings; no strict; # un-imports imported external modules
my $var; # declare a local variable (strict)
undef($null) if defined($null); # check if a variable is defined
eval '$pn = $0;'; print $pn; # interpret new perl code in runtime
system("del $filename"); # run commands in the shell (blocking)
system("start calc.exe"); # run commands in the shell
(nonblocking)
@files = `dir /b`; # run & get output of shell commands
("")

Powered by Notepad.

You might also like