use strict; use warnings; use charnames qw( :full ); sub current_reverse { return reverse(@_); } sub string_reverse { @_ = return reverse(@_) if wantarray; my @chars = join('', @_) =~ /./sg; return join '', @chars[ reverse 0..$#chars ]; } sub unicode_reverse { return reverse(@_) if wantarray; my @chars = join('', @_) =~ /\X/g; return join '', @chars[ reverse 0..$#chars ]; } printf("%-7s %-7s %-7s\n", "", "samples", "text"); printf("%-7s %-7s %-7s\n", "", "-------", "-------"); for (qw( current string unicode )) { my $reverser = do { no strict 'refs'; \&{ $_."_reverse" } }; my $water_samples = join '', map chr, 113, 101, 769; $water_samples = $reverser->($water_samples); my $last_sample = substr($water_samples, 0, 1); my $text = "Cafe\N{COMBINING ACUTE ACCENT}"; $text = $reverser->($text); my ($last_char) = $text =~ /^(\X)/; printf("%-7s %-7s %-7s\n", $_, ord($last_sample) == 769 ? 'ok' : 'not ok', $last_char eq "e\N{COMBINING ACUTE ACCENT}" ? 'ok' : 'not ok', ); }