in reply to (Golf) Mad-Lib Generator

100 characters:
print map{ if(s/\?$/? /){print STDERR;$_=<STDIN>;chop} @z=split/\|/;$z[rand@z] }map{split/\[(.+?)\]/}<>

Explanation:
Using split, transform all the lines of input into a list of "chunks"; each chunk is

For each chunk:
  1. If it ends in '?', then append a space to it, print it to STDERR, and replace it with the chomped/chopped input.
  2. Split it on '|' into an array, and select a random element from the array. If there is no '|' in the chunk, then the array contains the entire chunk in one element, and that element will always be "randomly" chosen.
Since the random selection occurs last in the map, its value is passed on to print for each chunk.

Notes:

  1. I beat my head against 101, until I s/chomp/chop/.
  2. Nothing was said about newline normalization, so I could remove the chop.
  3. In real golf, there would probably be a test case with '|' and trailing-'?' in non-bracketed text, which my program would fail to handle correctly.

Update: Forced "read all ARGV and close" with "@_=<>". This allowed me to change "<STDIN>" to "<>".
98 characters:

print map{if(s/\?$/? /){print STDERR;$_=<>;chop}@z=split/\|/;$z[rand@z +]}map{split/\[(.+?)\]/}@_=<>