Here you map over all elements of the DATA array, doing the following things:
remove the line brake at the end of the line
Set @INC, by splitting the current line on non-numeric values, thereby removing all charaters from the stuff in DATA. This made me wonder, because first I thought you where using the characters hidden between the numbers as your data. But, as I then found out, you just tossed me a red herring that I gullibly swalloed.
Now you modify your data structure. In the DATA-section, you stored the ascii values of each character (multiplied by either 1,2 or 3), like so (using the real characters):
(and these are NOT the 'L', the 'I', the 'H' etc you can see in the DATA section).
With this code segment, you first get item number $b (and divide by $b, so it is now the real ascii value), then you get $b+$a. As $a is 3, this gets the next value of the selected virtue. The shorter virtues are space-padded at the end.
Here you finally map over all values of @_, printing the character with the ascii value of $_. A nice way to prevent the much-overused chr. Voila.
Nice work! Especially as it's not just one more japh.
I espcially liked the auto-in/decrement stuff and the wrong track you laid in DATA.
#!/usr/bin/perl -w just another perl hacker