I quite like this solution to the problem as an interesting technique for impressing teachers:

++ for the funny reply, just as much as Anno's one. However...

my $str = "This is my program"; my @words = split ' ', $str;

[Still joking] This solution degrades whitespace, which his teacher may not want, and would earn him a bad mark. I'm astonished that no one took this into account yet. However the solution is easy:

my @chunks = split /(\s+)/, $str;

I changed @words to @chunks because they're not "words" any more. Of course later you may want to join on '' rather than on ' '.

But... Oh no! If there's leading or trailing whitespace, then this solution will be broken. And I don't want it to earn him a bad mark. Thus the first thing to do is to get rid of the empty leading field:

shift @chunks if $chunks[0] eq ''; # and then my $s = $chunks[0] =~ /\s/ ? 1 : 0; my $e = $chunks[-1] =~ /\s/ ? -2 : -1;

Later, you'd use $s and $e instead of 0 and -1. Of course, since the code defining $s and $e is very similar, it may be factored away as to define both of them at the same time by means of map:

my ($s,$e)=map $_ + ($chunks[$_] =~ /\s/ ? ($_ >=0 ? 1 : -1 ) : 0) => 0, -1;

We still want to earn him some extra marks, don't we?

map {s/[^a-z ]//gi} @words;

[On a more serious basis] I know that the tone of your answer is being sarcastic, but it also spawned some interest because of the notorious XOR technique, and up until now it has been a funny way to do something that one would better do differently. But it was also fundamentally correct, i.e. it exposed no Perl bad programming habit, while the OP is clearly a newbie and learning. So now what you show him is a use of map in void context for its side effects only, with a s used as a tr. If really wanting to use map, (and not having yet a .subst()) that should be

@words = map { (my $s=$_) =~ s/[^a-z ]//gi; $s } @words;

Moreover, the only spurious charachter will be a "\0" so with a

y/\0//d for @chunks; # or @chunks[$e,$s];

we would lose some irony but do a better instructive job.

Back to the joke! What could we do to earn the OP some more marks? Well, there are too many "chunks" around, and we may use the same trick as Anno's to factor them away. And as someone suggested, use interpolation in a double quoted string. The teacher will certainly be happy:

for ([split /(\s+)/, $str]) { shift @$_ if $_->[0] eq ''; my ($s,$e)= do { my @c=@$_; map $_ + ($c[$_] =~ /\s/ ? ($_ >=0 ? 1 : -1 ) : 0) => 0, -1; }; $_->[$s] ^= $_->[$e]; $_->[$e] ^= $_->[$s]; $_->[$s] ^= $_->[$e]; y/\0//d for @$_; local $"=''; print "@$_"; }

In reply to Re^2: How do I reverse the order of the first and last word of a string? by blazar
in thread How do I reverse the order of the first and last word of a string? by ferrispike12

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.