The computer doesn't know what a word is. When you call reverse on a string, it will flip around all the characters. But reverse also allows you to flip around a list of things, which makes more sense in your context.
In list context, returns a list value consisting of the elements of LIST in the opposite order. In scalar context, concatenates the elements of LIST and returns a string value with all characters in the opposite order.
You need to turn your string of words into a list of words, then turn that around, and then turn it back into a string.
If you look at your string, you will notice words are separated by empty space.
V V
one two three
You can split the string into an array on these spaces. Note that split takes a pattern as the separator.
my @words = split / /, $string;
Now you have an array of words.
( 'one', 'two', 'three' )
When you reverse that, it will do it to the elements, not each string inside them, so you get
my @words = reverse split / /, $string;
# ( 'three', 'two', 'one' )
Finally, if you want to put the spaces back in, use the opposite of split to join the list into a string again.
print join ' ', reverse split / /, $string;
# three two one