Just another perl hacker

From Citizendium
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
This article is developing and not approved.
Main Article
Discussion
Definition [?]
Related Articles  [?]
Bibliography  [?]
External Links  [?]
Citable Version  [?]
 
This editable Main Article is under development and subject to a disclaimer.

Example: $ perl -e 'print grep(s/^\d+(.*)/$1 /, sort(split(/ /,"8hacker, 4Perl 1Just 2another")));'

Result:
Just another Perl hacker,

Perl is evaluated from inside to outside of parens and from right to left, so ist is possible to squeeze all steps into a one-liner like the one above. But the example will be much more understandable if it is expanded into a program using intermediate variables:

$string = "8hacker, 4Perl 1Just 2another";
 
## split $string on white space (/ / is a shortcut with special meaning in context of `split')
@list   = split(/ /,$string);    # resulting in $list[0] = '8hacker,', list[1] = '4Perl', etc.

## the leading numbers are for the benefit of the builtin sort directive
@sorted = sort (@list);          # resulting in $sorted[0] = '1Just', $sorted[0] = '2another', etc.

## the following pattern detects a leading (shortcut '^') digit (shortcut \d, the '+' means at least one)
## and caches ('capture' shortcut '()') the remainder ('all characters' shortcut '.*')
$pattern = '^\d+(.*)';

## the example uses the builtin 'grep' and we could be done right here:
@result1 = grep(s/^\d+(.*)/$1 /, @sorted);

## but for a step-by-step explanation we will convert the grep into an equivalent loop:
@result2 = ();                   ## initialize to empty list, actually the default
@index   = (0 .. $#sorted);      ## ($#sorted: shortcut for index of last element of '@sorted')

foreach $index (@index)          ## ($index and @index are two independent variables!)
{
  ## to 'use =~ s///' directly on $sorted[$index] 
  ## would change the element, so we use a temp variable

  $tmp = $sorted[$index];
  $tmp =~ s/$pattern/$1/;        ## e.g. substitute '4Perl' with 'Perl'
  $result2[$index] = $tmp;
}

## a 'print @list' automatically inserts the output field separator ('$,')
print "result1:",@result1,"\n";
print "result2:",@result2,"\n";

Voila:
result1:Just another Perl hacker,
result2:Just another Perl hacker,


But what do you think is the output of this 2003 beauty from perlmonks.org?

$ perl -e '
not exp log srand xor s qq qx xor
s x x length uc ord and print chr
ord for qw q join use sub tied qx
xor eval xor print qq q q xor int
eval lc q m cos and print chr ord
for qw y abs ne open tied hex exp
ref y m xor scalar srand print qq
q q xor int eval lc qq y sqrt cos
and print chr ord for qw x printf
each return local x y or print qq
s s and eval q s undef or oct xor
time xor ref print chr int ord lc
foreach qw y hex alarm chdir kill
exec return y s gt sin sort split
'

Yep. "just another perl hacker". Just don't ask why ...