Morse code to standard output
Drat, I was hoping to get here before the GolfScripters arrived :-(
Anyhoo...
C: 228 characters:
char n,t,m[9],*c=&quot; etianmsurwdkgohvf l pjbxcyzq  54 3   2&amp; +    16=/   ( 7   8 90    $       ?_    \&quot;  .    @   '  -        ;! )     ,    :&quot;;
main(){while(scanf(&quot;%s&quot;,m)&gt;0){for(t=m[6]=n=0;m[n];n++)t+=t+1+(m[n]&amp;1);putchar(c[t]);}}


I thought I'd add an explanation of how this works.
The input data is parsed according to the tree data in *c, which can be expanded as follows (using · to represent a vacant node):
                     dot &lt;-- (start) --&gt; dash
                e                               t
        i               a               n               m
    s       u       r       w       d       k       g       o
  h   v   f   ·   l   ·   p   j   b   x   c   y   z   q   ·   ·
 5 4 · 3 · · · 2 &amp; · + · · · · 1 6 = / · · · ( · 7 · · · 8 · 9 0
····$·······?_····&quot;··.····@···'··-········;!·)·····,····:·······

Starting at the top of the tree, work your way down while moving to the left for a dot and to the right  for a dash. Then output whatever character you happen to be at when the input string ends (i.e., when a whitespace character is encountered). So for example, three dots and a dash will take you to v via e, i and s. Instead of explicitly checking for dots (ASCII \x2e) and dashes (ASCII \x2d), we only need to check the last bit (m[n]&amp;1), which is 0 for . and 1 for -.
Six rows are enough to encode everything except $, which has 7 dot/dashes: ...-..-, but since the input data is guaranteed to be valid, this can easily be fixed by truncating the input at 6 characters (m[6]=0) and interpreting ...-.. as $ instead. We can also cut away the last 7 bytes from the tree data, since they are all empty and aren't needed if the input is valid.