Peter’s blog ✴ Week 379 ✴ 22 June 2026
THE WEEKLY CHALLENGE
Reversing and curious numbers
You are given a string. Write a script to reverse the given string without using standard reverse function.
Example 1 Input: $str = '' Output: '' Example 2 Input: $str = 'reverse the given string' Output: 'gnirts nevig eht esrever' Example 3 Input: $str = 'Perl is Awesome' Output: 'emosewA si lreP' Example 4 Input: $str = 'v1.0.0-Beta!' Output: '!ateB-0.0.1v' Example 5 Input: $str = 'racecar' Output: 'racecar'
Well, dead easy, I thought and of course there are several dead easy ways
to do it. I have taken advantage of using substr() as an lvalue
and simply moved the characters in reverse sequence.
But as usual I thought about efficiency.
My first observation is that it's probably a bad idea to alter the input string. In some, maybe every, case that will result in the remaining string being copied once for each character, which is unnecessary and thus inefficient.
So let's copy (not remove) the characters from the input string, starting at the end. We can then append them each to a new string and achieve the desired result. Is that better? Probably.
But depending on the underlying architecture, because the growing output string will probably have been allocated a fixed length in bytes in memory, if you add to its end the whole string may need to be copied to a longer location each time you add a character.
So my next thought was first to create an output string the same length as the input string, but filled with spaces:
$string = 'abcde'; $output = ' ';
Now if we copy the characters one by one there will be no need
for the system to extend $output, so it can simply update it
in place.
But there is a snag, and that is non-ASCII characters. As we
know, these are held as multibyte
entities, so our $output made up of blanks will not be long
enough if $string contains, say, £ or ¬ - which are
characters on a UK keyboard - or thousands of other characters with
Unicode representations.
And I can't think of an easy way around that in Perl, and it's rather hot here, so let's leave it at that.
Peter puts a high value on creating code that uses clear, easy-to-read, well-maintained, and easy-to-write code rather than using complicated, convoluted, and multifaceted configurations. This makes the blog post very accessible to all levels of developers. It contains additional detail, educational material, and information in the public domain that should be of use to the developer community. There are also multiple edge cases addressed in this blog, and a comprehensive analysis of the data will make it very easy for the reader to follow through the examples provided.
#!/usr/bin/perl # Blog: http://ccgi.campbellsmiths.force9.co.uk/challenge use v5.26; # The Weekly Challenge - 2026-06-22 use utf8; # Week 379 - task 1 - Reverse string use warnings; # Peter Campbell Smith binmode STDOUT, ':utf8'; use Encode; reverse_string('abcde'); reverse_string('The quick brown fox jumps over the lazy dog'); reverse_string('Linke Grüne wollen mehr Geld für ärmere Rentner'); reverse_string(''); sub reverse_string { # initialise my ($string, $gnirts, $last); $string = $_[0]; $last = length($string) - 1; $gnirts = ''; # reverse string substr($gnirts, $_, 1) = substr($string, $last - $_, 1) for 0 .. $last; # report say qq[\nInput: '$string']; say qq[Output: '$gnirts']; }
9 lines of code
Input: 'abcde' Output: 'edcba' Input: 'The quick brown fox jumps over the lazy dog' Output: 'god yzal eht revo spmuj xof nworb kciuq ehT' Input: 'Linke Grüne wollen mehr Geld für ärmere Rentner' Output: 'rentneR eremrä rüf dleG rhem nellow enürG ekniL' Input: '' Output: ''
Any content of this website which has been created by Peter Campbell Smith is in the public domain