192 lines
3.9 KiB
Perl
Executable file
192 lines
3.9 KiB
Perl
Executable file
#!/usr/bin/perl
|
||
|
||
=head1 NAME
|
||
|
||
upsidedown - flip input upside down.
|
||
|
||
=head1 SYNOPSIS
|
||
|
||
B<upsidedown> inputtext
|
||
|
||
B<cat> <file with input text> | B<upsidedown>
|
||
|
||
=head1 DESCRIPTION
|
||
|
||
B<upsidedown> flips input text upside down.
|
||
|
||
|
||
=head1 EXAMPLE: Flip 'Ole Tange' upside down
|
||
|
||
upsidedown "'Ole Tange'"
|
||
|
||
|
||
=head1 BUGS
|
||
|
||
Upsidedown is not completely reversible.
|
||
|
||
|
||
=head1 REPORTING BUGS
|
||
|
||
Report bugs to <bug-parallel@gnu.org>.
|
||
|
||
|
||
=head1 AUTHOR
|
||
|
||
Copyright (C) 2012 Ole Tange, http://ole.tange.dk and Free
|
||
Software Foundation, Inc.
|
||
|
||
|
||
=head1 LICENSE
|
||
|
||
Copyright (C) 2012 Free Software Foundation, Inc.
|
||
|
||
This program is free software; you can redistribute it and/or modify
|
||
it under the terms of the GNU General Public License as published by
|
||
the Free Software Foundation; either version 3 of the License, or
|
||
at your option any later version.
|
||
|
||
This program is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
GNU General Public License for more details.
|
||
|
||
You should have received a copy of the GNU General Public License
|
||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
||
=head2 Documentation license I
|
||
|
||
Permission is granted to copy, distribute and/or modify this documentation
|
||
under the terms of the GNU Free Documentation License, Version 1.3 or
|
||
any later version published by the Free Software Foundation; with no
|
||
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
|
||
Texts. A copy of the license is included in the file fdl.txt.
|
||
|
||
=head2 Documentation license II
|
||
|
||
You are free:
|
||
|
||
=over 9
|
||
|
||
=item B<to Share>
|
||
|
||
to copy, distribute and transmit the work
|
||
|
||
=item B<to Remix>
|
||
|
||
to adapt the work
|
||
|
||
=back
|
||
|
||
Under the following conditions:
|
||
|
||
=over 9
|
||
|
||
=item B<Attribution>
|
||
|
||
You must attribute the work in the manner specified by the author or
|
||
licensor (but not in any way that suggests that they endorse you or
|
||
your use of the work).
|
||
|
||
=item B<Share Alike>
|
||
|
||
If you alter, transform, or build upon this work, you may distribute
|
||
the resulting work only under the same, similar or a compatible
|
||
license.
|
||
|
||
=back
|
||
|
||
With the understanding that:
|
||
|
||
=over 9
|
||
|
||
=item B<Waiver>
|
||
|
||
Any of the above conditions can be waived if you get permission from
|
||
the copyright holder.
|
||
|
||
=item B<Public Domain>
|
||
|
||
Where the work or any of its elements is in the public domain under
|
||
applicable law, that status is in no way affected by the license.
|
||
|
||
=item B<Other Rights>
|
||
|
||
In no way are any of the following rights affected by the license:
|
||
|
||
=over 2
|
||
|
||
=item *
|
||
|
||
Your fair dealing or fair use rights, or other applicable
|
||
copyright exceptions and limitations;
|
||
|
||
=item *
|
||
|
||
The author's moral rights;
|
||
|
||
=item *
|
||
|
||
Rights other persons may have either in the work itself or in
|
||
how the work is used, such as publicity or privacy rights.
|
||
|
||
=back
|
||
|
||
=back
|
||
|
||
=over 9
|
||
|
||
=item B<Notice>
|
||
|
||
For any reuse or distribution, you must make clear to others the
|
||
license terms of this work.
|
||
|
||
=back
|
||
|
||
A copy of the full license is included in the file as cc-by-sa.txt.
|
||
|
||
=head1 DEPENDENCIES
|
||
|
||
B<upsidedown> uses Perl, and the Perl module utf8.
|
||
|
||
|
||
=head1 SEE ALSO
|
||
|
||
B<tr>(1)
|
||
|
||
=cut
|
||
|
||
|
||
use utf8;
|
||
|
||
my $down = ' @{}'.
|
||
q{ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.,';0123456789?!"&()[]/\_‾=-<>};
|
||
my @up = (" ",qw(@ } {),
|
||
qw{∀ q Ɔ p Ǝ Ⅎ ⅁ H I ſ ʞ ⅂ W N O Ԁ Ό ᴚ S ⊥ ∩ Ʌ M X ⅄ Z ɐ q ɔ p ǝ ɟ 6 ɥ ı ſ ʞ l},
|
||
qw{ɯ u o d b ɹ s ʇ n ʌ ʍ x ʎ z ˙ ' , ؛ 0 Ɩ 2 Ɛ ᔭ 5 9 Ɫ 8 6 ¿ ¡ „ ⅋ ) ( ] [ / \ ‾ _ = - > <});
|
||
|
||
my %up;
|
||
my @down = split//,$down;
|
||
@up{@up} = @down;
|
||
@up{@down} = @up;
|
||
|
||
binmode STDOUT, ':utf8';
|
||
binmode STDIN, ':utf8';
|
||
if(@ARGV) {
|
||
print upsidedown("@ARGV"),"\n";
|
||
} else {
|
||
while(<>) {
|
||
print upsidedown($_),"\n";
|
||
}
|
||
}
|
||
|
||
sub upsidedown {
|
||
my $string = shift;
|
||
my @r = ();
|
||
for (reverse split//,$string) {
|
||
# Return the letter upside down
|
||
# - or itself if not upside down defined
|
||
push @r, ($up{$_} or $_);
|
||
}
|
||
return @r;
|
||
}
|