Turning text upside-down

I wrote this code in 1995. For an update from 2018, including a link to a much better online tool for creating upside-down-looking text, see my Words & Stuff column XXX: uʍop-ǝpısdn.


#!/usr/sbin/perl

# umop.pl: Program to turn a string upside-down.
#
# Version 1.0, copyright 1995 by Jed Hartman.
# Last modification: 16 August 1995.
#
# Based on my earlier umop.c.  The perl version is much shorter!
#
# Permission to use, copy, modify, and distribute this software and its
# documentation, in whole or in part, for any purpose and without fee is
# hereby granted, provided that: (a) the above copyright notice appear in
# all copies; (b) both the copyright notice and this permission notice
# appear in supporting documentation; and (c) no fee is charged for further
# redistribution of the software.  This software is provided "as is" without
# express or implied warranty.
#
# Thanks to Jef Poskanzer for the permission-to-use notice.
#
#
# Notes:
#
# Reads standard input or a list of files on the command line; writes to
# standard output.  Any character which cannot be reasonably inverted is
# left alone; many uppercase characters are converted to lowercase.
# Inversions look better in some typefaces than in others.  To change the
# inversion mapping, edit the two strings in the line containing the "tr"
# command.
#
# Width-to-justify-in defaults to 78 columns.  If you want to specify some
# other width, use -w width on the command line.
#
# If by some chance you don't have access to the getopt.pl command-line-
# option-handling library, just comment out everything before the first
# "while" line below, except the "$width = 78" line.
#
# Arguably, umop should re-wrap the inverted text to the specified number of
# columns, rather than just attempting to justify each line in that number
# of columns.  But that's a project for another day.
#
# If you have comments or suggestions, write to me at logos@kith.org.  I'm a
# novice perl hacker and would be delighted to receive style comments.


# Get command-line option(s):

require "getopt.pl";

&Getopt('w');


# Set justification width according to command line:

if ($opt_w && $opt_w != 1)
{
  $width = $opt_w;
}
else
{
  $width = 78;
}


# For each line of input, replace every character with a character that
# looks like it upside-down.  Then reverse the order of the characters on
# the line.

while ($a[$i] = <>)
{
  chop ($a[$i]);
  $a[$i] =~ tr/A-Za-z,`'()[]>p3j6HIrK7WNOdbJS+nAMXhZeq>paj6y!fklwuodbJs+n^mxhz`,,)(][<>i5Eh29L6v/;
  $a[$i] = reverse $a[$i];
  $i++;
}


# Reverse the order of the lines, and print them right-justified.

@a = reverse @a;

foreach (@a)
{
  printf "%${width}s\n",$_;
}