[Question]
  [
Your goal is to write a program that prints the following poem exactly as it appears here:
```
There was an old lady who swallowed a fly.
I don't know why she swallowed that fly,
Perhaps she'll die.
There was an old lady who swallowed a spider,
That wriggled and iggled and jiggled inside her.
She swallowed the spider to catch the fly,
I don't know why she swallowed that fly,
Perhaps she'll die.
There was an old lady who swallowed a bird,
How absurd to swallow a bird.
She swallowed the bird to catch the spider,
She swallowed the spider to catch the fly,
I don't know why she swallowed that fly,
Perhaps she'll die.
There was an old lady who swallowed a cat,
Imagine that to swallow a cat.
She swallowed the cat to catch the bird,
She swallowed the bird to catch the spider,
She swallowed the spider to catch the fly,
I don't know why she swallowed that fly,
Perhaps she'll die.
There was an old lady who swallowed a dog,
What a hog to swallow a dog.
She swallowed the dog to catch the cat,
She swallowed the cat to catch the bird,
She swallowed the bird to catch the spider,
She swallowed the spider to catch the fly,
I don't know why she swallowed that fly,
Perhaps she'll die.
There was an old lady who swallowed a horse,
She died of course.
```
The text must appear exactly as it does here, and fewest characters wins.
Edit: Your program may not access the internet.
  
[Answer]
## Perl 5.10, ~~392~~ ~~384~~ ~~372~~ ~~235~~ 369 (ASCII) / 234 (Unicode)
The shortest ASCII version of this is 369 characters long:
```
@_=(fly,spider,bird,cat,dog);$_="There was an old lady who!ed a";for$P("",",
That wrJand Jand jJinside her",",
How absurd&",",
Imagine that&",",
What a hog&"){$p=$c;$c=$".shift@_;$t=$p?"She!ed the$c to catch the$p,
$t":"I don't know why she!ed that$c,
Perhaps she'll die.
$_";$_.="$c$P.
$t";s/&/ to! a$c/}s/!/ swallow/g;s/J/iggled /g;say"$_ horse,
She died of course."
```
It started from this base program:
```
my @animals = qw(fly spider bird cat dog);
my $buf = "There was an old lady who swallowed a ";
for my $phrase ( "",
                 ",\nThat wriggled and iggled and jiggled inside her",
                 ",\nHow absurd&",
                 ",\nImagine that&",
                 ",\nWhat a hog&" ) { 
  $previous = $current;
  $current = shift @animals;
  $trail = $previous ? "She swallowed the $current to catch the $previous,\n$trail"
                     : "I don't know why she swallowed that $current,\n"
                       . "Perhaps she'll die.\n\n$buf";
  $buf .= "$current$phrase.\n$trail";
  $buf =~ s/&/ to swallow a $current/;
}
say "$buf horse,\nShe died of course.";
```
The core idea is to keep the end of the rhyme and the beginning of the next one in `$trail`, augmenting it as we go along. It's made non-trivial by the need of a special case for the first use, and the attempt to re-use the animal name variable even in the animal-specific phrase. Further optimizations include:
* one-character identifiers for everything
* using barewords instead of quoted strings for the animal list
* use of the accumulator `$_` for `$buf` to shorten most substitution operations even more (use of `@_` is by force of habit and doesn't win anything more than any other character)
* including the preceding space directly inside the animal name variable (the space character taken from the `$"` variable)
* regexp substitution to shorten the most common phrases: `' swallow'` and `'iggled '`
* no code spacing whatsoever and all `\n` in string literals replaced with actual newlines
All but the last optimization yield this:
```
@_ = (fly, spider, bird, cat, dog);
$_ = "There was an old lady who!ed a";
for $P ( "",
         ",\nThat wrJand Jand jJinside her",
         ",\nHow absurd&",
         ",\nImagine that&",
         ",\nWhat a hog&" ) { 
  $p = $c;
  $c = $" . shift @_;
  $t = $p ? "She!ed the$c to catch the$p,\n$t"
          : "I don't know why she!ed that$c,\nPerhaps she'll die.\n\n$_";
  $_ .= "$c$P.\n$t";
  s/&/ to! a$c/;
}
s/!/ swallow/g;
s/J/iggled /g;
say "$_ horse,\nShe died of course.";
```
Additionally, this golf is a victim of the underspecified encoding problem. As it—as of now—counts individual characters instead of bytes in a specified encoding, there's a big gain to be achieved by decoding the program source from UCS2 before starting. The final result isn't very readable anymore, but it's short all right. (234 characters, counted as a difference from `perl -E''` as usual) (I had to include the trailing newline back to make it valid UCS2)
```
$ perl -MEncode=from_to -e'$_="‰Åü„¥®Êô¨Á§¨Áç∞Ê•§Êï≤‚±¢Ê•≤Êê¨Êç°Áê¨ÊëØÊú©„¨§ÂºΩ‚âîÊ°•Áâ•‚Å∑ÊÖ≥‚Å°Ê∏†ÊΩ¨Êê†Ê±°Êëπ‚Å∑Ê°Ø‚Ö•Êê†ÊÑ¢„≠¶ÊΩ≤‚ëê‚†¢‚à¨‚à¨‡©îÊ°°Áê†Áù≤‰©°Êπ§‚ÅäÊÖÆÊê†Ê©äÊ•ÆÁç©Êë•‚Å®Êï≤‚à¨‚à¨‡©àÊΩ∑‚Å°Êâ≥Áï≤Êê¶‚à¨‚à¨‡©âÊµ°Êù©Êπ•‚Å¥Ê°°Áê¶‚à¨‚à¨‡©óÊ°°Áê†ÊÑ†Ê°ØÊú¶‚à©Á¨§ÁÄΩ‚ë£„¨§ÊåΩ‚ê¢‚π≥Ê°©Êô¥‰Åü„¨§ÁêΩ‚ë∞„º¢Âç®Êî°Êï§‚Å¥Ê°•‚ë£‚Å¥Êº†Êç°Áë£Ê††Áë®Êî§ÁÄ¨‡®§Áê¢„®¢‰§†ÊëØÊ∏ßÁê†Ê≠ÆÊΩ∑‚Å∑Ê°π‚Å≥Ê°•‚Ö•Êê†Áë®ÊÖ¥‚ë£‚∞äÂÅ•Áâ®ÊÖ∞Áå†Áç®ÊîßÊ±¨‚Å§Ê••‚∏ä‡®§Âº¢„¨§ÂºÆ„¥¢‚ë£‚ëê‚∏ä‚ë¥‚àªÁåØ‚òØ‚Å¥Êº°‚Å°‚ë£‚ΩΩÁåØ‚ÑØ‚Å≥Áù°Ê±¨ÊΩ∑‚Ωß„≠≥‚Ωä‚Ω©ÊùßÊ±•Êê†‚Ωß„≠≥ÊÖπ‚à§Âº†Ê°ØÁâ≥Êî¨‡©ìÊ°•‚Å§Ê••Êê†ÊΩ¶‚Å£ÊΩµÁâ≥ÊîÆ‚àä";from_to($_,utf8,ucs2);eval'
```
A good thing there was a lot to golf from before resorting to Unicode, or it wouldn't be much fun.
*Edit:* ~~can't find a way to copy/paste the 234-character version to this browser, so I'm leaving the 235-character one. Will fix this evening, when I get my hands on a real UTF8-aware clipboard.~~ found a way. [Quasi-proof on ideone.](http://ideone.com/lGxnl)
[Answer]
## Perl, 120 94 chars
Count includes call to the interpreter.
You did say to reproduce it *exactly* as it does here ;)
```
perl -MLWP::Simple -E'($p=get("http://goo.gl/kg17j"))=~s#^.+?pr.*?de>|</co.*?re>.+$##sg;say$p'
```
### N.B.
This solution is what prompted the 'no-Internet' restriction. Let it be a lesson for future code-golf question specifications :)
[Answer]
# Vim, 373 keystrokes
```
iThere was an old lady who swallowed a fly.
I don't know why she s<C-n> that f<C-n>,
Perhaps she'll die.
T<C-x><C-l><Left><C-w>spider<Esc>oThat wriggled <Esc>6hiand <Esc>3hy$u$ppbij<End>inside her.
She s<C-n> the sp<C-n> to catch the f<C-n>,
I<C-x><C-l><C-x><C-l><Esc>qqyapGp3jYPkk$Bqcwbird<Esc>+CHow absurd to sw<C-n><Backspace><Backspace> a b<C-n>.<Esc>qwyb5wvep$Bvepq@qcwcat<Esc>+CImagine that to sw<C-p> a cat.<Esc>@w@qcwdog<Esc>+CWhat a hog to sw<C-p> a dog.<Esc>@w@qcwhorse<Esc>+cGShe d<C-p>d of course.
```
Funny how exponential that scrambling is.
[Answer]
## Python 3.x: 407 chars
```
import base64,zlib;print(zlib.decompress(base64.b64decode(b'eNrlkLFOxDAQRPt8xXTXoHwHdEhEot7L+myD8Z7snKz8Pd6LT7mgFFQIRGftPs/OzOBMMiiUQRESGIF4RnGCXCgEKYZBOIW5B7onsMTDhPcopTIzsjN33ORoUvShos8mOTpnJQ4hgL3pu2741rF89mySigwqWJK3NugmMu6eb+3tY648qrRafPniyDQ5TIKRptFdZ83kz+Q5+sQq8ViP0DFfEquZRrT9vnXdbI2v3fzCoPXs9dgHWR/NorpJWoH9oONCrr5vnf35TlisKryqGsGJ3TZS1/uN8EKurlu5/6k7Jymbm7f6kSEnjHKp0/4TSSOZgA==')).decode('utf8'))
```
[Answer]
## JavaScript (422)
Works in the [SpiderMonkey interpreter versions](https://developer.mozilla.org/en/Introduction_to_the_JavaScript_shell) used by both [anarchy golf](http://golf.shinh.org/) and [ideone](http://www.ideone.com/5KomT).
```
for(a="fly0spider0bird0cat0dog0horse0How absurd0Imagine that0What a hog".split(i=0);p=print;p("I don't know why she swallowed that fly,\nPerhaps she'll die.\n")){p("There was an old lady who swallowed a",a[i]+(i?",":"."));i>4&&quit(p("She died of course."));i&&p(i>1?a[4+i]+" to swallow a "+a[i]+".":"That wriggled and iggled and jiggled inside her.");for(j=i++;j;)p("She swallowed the "+a[j]+" to catch the "+a[--j]+",")}
```
A bit more nicely formatted:
```
for (a = "fly0spider0bird0cat0dog0horse0How absurd0Imagine that0What a hog".split(i = 0);
p = print; p("I don't know why she swallowed that fly,\nPerhaps she'll die.\n")) {
    p("There was an old lady who swallowed a", a[i] + (i ? "," : "."));
    i > 4 && quit(p("She died of course."));
    i && p(i > 1
        ? a[4 + i] + " to swallow a " + a[i] + "."
        : "That wriggled and iggled and jiggled inside her."
    );
    for (j = i++; j;) p("She swallowed the " + a[j] + " to catch the " + a[--j] + ",");
}
```
[Answer]
# [ink](https://github.com/inkle/ink), ~~370~~ ~~369~~ 354 bytes
```
LIST B=fly,spider,bird,cat,dog,horse
VAR s=" swallow"
-(i)~B=B(i)
There was an old lady who{s}ed a {B}{.|,}
{|That wriggled and iggled and jiggled inside her|How absurd|Imagine that|What a hog|She died of course.->END}{|.| to{s} a {B}.}
-(k)~B--
{B:
She{s}ed the {B+1} to catch the {B},
->k
}I don't know why she{s}ed that fly,
Perhaps she'll die.
\ 
->i
```
[Try it online!](https://tio.run/##TdBBa8MgGAbgu7/io5duzAR2HaQw2WCBMcZatssuNtro4rRoigR1fz37QgvbSfHzfXlU22Gen9vtDlhzMBMNRy2kp3vtBe34SIXrqXI@SPJ@/wahWUGI3BgXV6S60tc/rGG4kJ2SXkLkAbgFZwQYLiaIyqVQpAAOiZVUZ1pIyjvFR4he971ZRlbAv@3XZa9tQAhgbX5yEfg@nLzI7TfvtZUwYkX@WHo4KNfnrZIgNMbcATp3Qm5dbR5fHkrKdYZxUZwNdUH2gOyqIondEQyehSM2JHZzW/A24MM7dTkqlFSbgZQWhLPrEQaLnKgmCH9RdCx/R16lV/wYltHamEVUk0/AvJ7nXw "ink ‚Äì Try It Online")
### Explanation
```
LIST B=fly,spider,bird,cat,dog,horse           // Ink's "LIST"s aren't much like lists - they're more like enums. Here we create a list type stating what animals exist, and make a set containing none of them.
VAR s=" swallow "                              // Pretty self-explanatory
-(i)~B=B(i)                                    // The i label keeps track of how many times we've visited it. We set B (the set) to be equal to the i-th item in B (the list type).
There was an old lady who{s}ed a {B}{.|,}      // Print the first line. {.|,} is a sequence - it's a period the first time it's encountered, and a comma every subsequent time.
                                               // Sequences can have more than one item in them, which is how we print the second line. When we get to the horse one, we terminate the program right away.
{|That wriggled and iggled and jiggled inside her|How absurd|Imagine that|What a hog|She died of course.->END}{|.|to{s} a {B}}.}
-(k)~B--                                       // Step back through the list type.
{B:                                            // A conditional - we execure the next two lines if B is non-empty.
She{s}ed the {B+1} to catch the {B},           // Print the "she swallowed the..." line
->k                                            // And repeat
}I don't know why she{s}ed that fly,           // Only reached when the conditional fails.
Perhaps she'll die.
\                                              // A backslash and a space to force an empty line.
->i                                            // Back to the top
```
[Answer]
# [C (gcc)](https://gcc.gnu.org/), ~~429~~ ~~424~~ 423 bytes
-5 bytes thanks to [ceilingcat](https://codegolf.stackexchange.com/users/52904/ceilingcat)
```
c,*w[]={"384fly<1","I don't know why she5ed that fly<Perhaps she'll die.772","There was an old lady who5ed a ","She5ed the "," to catch the "," swallow"," to5 a ","\n","spider","bird","cat","iggled ",",7","3948<0"};U(char*s){for(;c=*s++;)c>47&c<65?U(w[c-48]):putchar(c);}f(){U("2fly.718<That wr;and ;and j;inside her.709<How absurd69.7=:<Imagine that6:.73:49<=dog<What a hog6dog.73dog4:<3:49<=horse<She died of course.7");}
```
[Try it online!](https://tio.run/##PVDLbsIwEPyVVQ4loRDxCHEepr2WW6WCeqAcjO3EaYON7CALIb6dbkDtZeyd3RnNLh/XnN9ufDT0293yEsyzpGrPdBqMghUIowcd/GjjwaszOCUXUkCnWAf90Lu0ih1dzw/aFkQjY0JmqFwraSV45oBpMK2AlokzWphezgAnPv6sZF9BZ4Czjqt/wnnWtsY/eouH5ksjuGMjpMXPvrECH5QhNnXdoh3@RgRhnicZnQTXchNyxezQRZfK2LDky6F7fi4j/pKQJ07Txesm9Fs@TrJdVBxPXT8c8qi8VmF02YTBDLeMyTSj635lb0umBdzhu2y0wySAm8ZkktM3vBHbu5MVaR6TZUFXB1Y3Wt6vlRYxmRdJTpfC1PSzN2OgTJ1iiR3EpKCPAWWskxTP059TgKmAmxNSMQkw163RHRxYozEfZkTiFw "C (gcc) ‚Äì Try It Online")
[Answer]
### Ruby, 436 characters
```
w=" swallowed "
f="There was an old lady who#{w}a "
c=" to swallow a %s"
b="dog","cat","bird","spider","fly"
s=nil,"That wriggled and iggled and jiggled inside her","How absurd"+c,"Imagine that"+c,"What a hog"+c
a=[]
5.times{k=g=b.pop;t,*s=s
puts f+k+(t ??,:?.),t&&[t%k+?.,a.map{|x|y,k=k,x;"She#{w}the #{y} to catch the #{k},"}],"I don't know why she#{w}that fly,","Perhaps she'll die.",""
a=[g]+a}
puts f+"horse,","She died of course."
```
[Answer]
## Scala (~~706~~ ~~619~~ ~~599~~ 550 chars)
```
val L=Seq("fly","spider","bird","cat","dog")
val M="\nThere was an old lady who %sed a %s,"
type S=String
def s(l:S,a:S="",b:S="")=l.format("swallow",a,b)
def p(l:S,a:S=""){println(s(l,a))}
var i=0
var r=List[S]()
L.map{a=>{p(M,a)
if(i>0){p(Seq("","That wriggled and iggled and jiggled inside her.","How absurd","Imagine that","What a hog")(i)+(if(i>1)" to %s a %s."else""),a)
r::=s("She %sed the %s to catch the %s,",L(i),L(i-1))
r.map(p(_))}
p("I don't know why she %sed that fly,\nPerhaps she'll die.")
i+=1}}
p(M,"horse")
p("She died of course.")
```
Using map instead of foreach allows to squeeze more chars... In codegolf, we don't care about performance, elegance (non-mutability) or logic...
[Answer]
# [PowerShell Core](https://github.com/PowerShell/PowerShell), ~~503~~ 484 bytes
```
$i=" bird"
$k=" swallowed"
$g="She$k the"
$h=" to catch the"
$c="There was an old lady who$k a"
$e=" to swallow a"
$s=" spider"
"$c fly."
$c="`n$c"
($a="I don't know why she$k that fly,`nPerhaps she'll die.")
"$c$s,`nThat wriggled and iggled and jiggled inside her."
($d="$g$s$h fly,")
$a
"$c$i,`nHow absurd$e$i."
($j="$g$i$h$s,")
$d
$a
"$c cat,`nImagine that$e cat."
($b="$g cat$h$i,")
$j
$d
$a
"$c dog,`nWhat a hog$e dog.`n$g dog$h cat,"
$b
$j
$d
$a
"$c horse,`nShe died of course."
```
[Try it online!](https://tio.run/##VZExbsMwDEX3nIIQCKQFWt/Ae7MVaICukUVWUqJKgeTAyOldUvGQbhT53@c3fS0L1xY4pXdXKq8rxtHAFCuZHV6kbItNSUT69qP5CowXmAPLM8h4LuDs7MLWcqM5Bq4Mi21gM5REkCzdYQlFOCsSflCbb2813XONxNXsDDr4SffhYXbK6MzuBe1oDkAl72e4ZKGWcIe2RbGzAm@n/Mk12GvTwT4loMiDeVVDbDI9qnCp0fvEJNkInsrzVsfcJAbIJwy6lkaDHhuGvkHM0Ha/KH4fGn5qt0rIGLv83OURgyxUMW16PZEQh1/rY@YeGVmbnZqU0pdwsXPnJ5SKF/Rbw1sIxQsorUEO47WQaGou15r@c6HUxkLKD9NLEJQfcOUmzcGs6x8 "PowerShell Core ‚Äì Try It Online")
It was a fun one! :)
[Answer]
# [05AB1E](https://github.com/Adriandmen/05AB1E), ~~237~~ ~~222~~ ~~218~~ 224 bytes
+6 bytes to fix a bug (In most verses the first line ends in a `,`)
```
‚Äú¬§‚Ä†√â¬æ¬£‚Ä°‚Äî√Ñ‚Äπ¬∑√Æ‚Ç¨‚Äú#¬©‚Ç¨‚Äú‚Ç¨√á‚Ç¨¬•‚Ç¨¬§‚Äû√è¬£√Æ‚Ç¨√ê 1ed‚Ç¨‚Ä¶ √ø,‚Äú¬Æ¬¶¬¶¬®.‚Ä¢Œ©\3¬Ø√ì√µ√î)V‚ÇÑH`¬´√Ö‚ÇÜ√©√ÖŒòŒì√•√≤‚Ä¢ƒá¬°Œ¥"√ø to 1 a √ø."√Ö\‚Äú‚Ç¨≈† wr0‚Ç¨∆í 0‚Ç¨∆í j0‚Äπ√¢‚Äö¬Æ.‚Äú≈°‚Äú‚Äö√é≈ì¬∑‚Ç¨‚Äö‚Ä¶¬£.‚Äú¬™0≈°√∏0Œ¥K¬Æ√º‚Äú‚Äö√é 1ed‚Ç¨‚Ç¨ √ø‚Ç¨‚Äû¬¨¬™‚Ç¨‚Ç¨ √ø,‚Äú¬®Œ∑√≠√µ≈°Œµ‚Äúi¬•√ö't∆í‚Ç¨‚Äû√ù‚Äö√é 1ed‚Ç¨≈†¬§‚Ä†,‚Äú¬™‚Äú‚Ñ¢¬°‚Äö√é'll‚Äî√á.
‚Äú¬™}√µ¬™.ŒπÀú.¬™¬ªT.‚Ä¢4∆µ‚Ä∫‚ÇÖ8zŒµ√öS‚Ä¢#‚Ä°¬®','..;
```
[Try it online!](https://tio.run/##TVFBSwJBFL73KwY9LIEMK3UI@gNBx6KTh4w8GIJQQhAEw@ImXSq0QywmrqboZhuEi1mR8F7rJZgfMX9kezNmxMCbN/O@933fvCmf5A@KhSRRogkPSrTxEj6hq4SvxC1WlZjCBEPljKiehuEioYg1CtDTgbpaeA1dA8Mbli0cGlif4SyjaUPo0xpwJTpymFuDZ2xghLere8qpbu3DI7rKucAhuvJONrCHLwT8qoEvxymcsUqZZVmeuHgK3dxCPW6z02Obknmd/W5HNnnFjhIehKTUjH0NFR5exQ2YGEMeeYKuLkJgxz6@2nK8DSF@LJFL686I5ExLC0YQ/F2Z1wzkBJ8win0Z0bEIPfSsyry@gOP9f6K4bUZq2gItUu2AbwBWqaTnW@MrpnaOEQRcTr@bHAJ439WjWp8T/5ty3I0zGaG3Q1dp@hYYWBmL880k@QE "05AB1E ‚Äì Try It Online")
**Commented:**
```
‚Äú¬§‚Ä†√â¬æ¬£‚Ä°‚Äî√Ñ‚Äπ¬∑√Æ‚Ç¨‚Äú              # push dictionary compressed string "fly spider bird cat dog horse"
#                           # split on spaces
¬©                           # store the list of animals in the register
‚Ç¨‚Äú‚Ç¨√á‚Ç¨¬•‚Ç¨¬§‚Äû√è¬£√Æ‚Ç¨√ê 1ed‚Ç¨‚Ä¶ √ø,‚Äú    # for each animal, push the string "there was an old lady who 1ed a √ø,"
                            #   where √ø s replaced by the animal
¬Æ                           # push the list of animals again
¬¶¬¶¬®                         # remove the fly, the spider and the horse: ["bird", "cat", "dog"]
.‚Ä¢Œ©\3¬Ø√ì√µ√î)V‚ÇÑH`¬´√Ö‚ÇÜ√©√ÖŒòŒì√•√≤‚Ä¢    # push alphabet compressed string "xhow absurdximagine thatxwhat a hog"
ƒá                           # extract the first character "x"
¬°                           # split the remaining string on "x": ["how absurd", "imagine that", "what a hog"]
Œ¥"√ø to 1 a √ø."√Ö\            # format the string "√ø to 1 a √ø." with a value from this list and one from the short animal list
                            #  => ["how absurd to 1 a bird.", "imagine that to 1 a cat.", "what a hog to 1 a dog."]
‚Äú‚Ç¨≈† wr0‚Ç¨∆í 0‚Ç¨∆í j0‚Äπ√¢‚Äö¬Æ.‚Äú      # push compressed dictionary string "that wr0 and 0 and j0 inside her."
≈°                           # prepend this to the list
‚Äú‚Äö√é≈ì¬∑‚Ç¨‚Äö‚Ä¶¬£.‚Äú                 # push compressed dictionary string "she died of course."
¬™                           # append this to the list
0≈°                          # prepeand a 0
√∏                           # zip both lists together
0Œ¥K                         # remove 0's in sublists
                            #  => [["there was an old lady who 1ed a fly,"],
                            #      ["there was an old lady who 1ed a spider,", "that wr0 and 0 and j0 inside her."],
                            #      ["there was an old lady who 1ed a bird,", "how absurd to 1 a bird."],
                            #      ["there was an old lady who 1ed a cat,", "imagine that to 1 a cat."],
                            #      ["there was an old lady who 1ed a dog,", "what a hog to 1 a dog."],
                            #      ["there was an old lady who 1ed a horse,", "she died of course."]]
¬Æ                           # push the list of animals again
√º‚Äú‚Äö√é 1ed‚Ç¨‚Ç¨ √ø‚Ç¨‚Äû¬¨¬™‚Ç¨‚Ç¨ √ø,‚Äú      # format the string "she 1ed the √ø to catch the √ø," with adjacent pairs of animals
¬®                           # remove the last string
                            #  => ["she 1ed the spider to catch the fly,", "she 1ed the bird to catch the spider,", "she 1ed the cat to catch the bird,", "she 1ed the dog to catch the cat,"]
Œ∑                           # take the prefixes of this list
√≠                           # reverse each prefix
√µ≈°                          # prepend the empty string
Œµ                           # map over the prefixes:
  ‚Äúi¬•√ö't∆í‚Ç¨‚Äû√ù‚Äö√é 1ed‚Ç¨≈†¬§‚Ä†,‚Äú    #   push compressed string "i don't know why she 1ed that fly,"
  ¬™                         #   append to the prefix
  ‚Äú‚Ñ¢¬°‚Äö√é'll‚Äî√á.\n‚Äú            #   push compressed string "perhaps she'll die.\n"
  ¬™                         #   append to the prefix
}                           # end of map
√µ¬™                          # append an empty string to the list of prefixes
.Œπ                          # interleave the list of prefixes with the earlier list
Àú                           # flatten everything into a list of lines
.¬™                          # sentence-case each line
¬ª                           # join by newlines
T                           # push 10
.‚Ä¢4∆µ‚Ä∫‚ÇÖ8zŒµ√öS‚Ä¢                # push compressed string "swallow iggled"
#                           # split on the space
‚Ä°                           # in the poem replace every digit of 10 with the corresponding word in this list
                            #   1 -> swallow, 0 -> iggled
¬®                           # remove a trailing newline
','..;                      # replace the first "," with a "."
```
[Answer]
# [Stax](https://github.com/tomtheisen/stax), 195 [bytes](https://github.com/tomtheisen/stax/blob/master/docs/packed.md#packed-stax)
```
√≥‚î§‚ô£‚â§j√ü¬°ŒµD<√áj√≤‚â°¬≤¬£c¬º√¨v‚î¥√Ö√¥‚ïë,¬∑~‚îº¬¢‚ïùEŒ¶5xZ&‚àöœÉ"√∏m√ø‚â°ZœÄv√Ö‚ï¶‚ô£1‚ô¶>‚ñÑ\¬¨‚óò¬°jS¬¢√≠‚ïû‚ïü‚ïö);4j‚Üïi¬¢s‚ô¶√©√á√∂y‚Äºac‚î¥√†√á‚ï©¬ª-√≥¬ª√≥n√∫¬¢‚îÇg5Œµ√ø‚ïî¬µ‚î¨b√Æ√¶¬¢k‚Äºf‚ïìfJ‚óã‚ñê‚ïê‚ïú<^Œì‚ñÄo‚ñÄŒînq‚ñë‚ï©Œ±√Ñ&‚îÇ‚ô£‚Åø√¢m√ª‚ï£√á‚â°*@‚ò∫pG_‚Åø√∂‚î§mœÉ/V\‚îî?iq‚îå√ÆB¬Ω√Ñ¬øL‚ïôN‚îê¬£√á‚â•Œ¥2 0Œ¥r¬µL√§‚å°(‚å°‚ñÄ‚ï¨√†Œ¶‚å†t∆í√¨g" ‚å†ZH√≥
```
[Run and debug it](https://staxlang.xyz/#p=a2b405f36ae1adee443c806a95f0fd9c63ac8d76c18f93ba2cfa7ec59bbc45e835785a26fbe522006d98f05ae3768fcb0531043edc5caa08ad6a539ba1c6c7c8293b346a12699b730482809479136163c18580caaf2da2afa26ea39bb36735ee98c9e6c2628c919b6b1366d6664a09decdbd3c5ee2df6fdfff6e71b0cae08e26b305fc836d96b980f02a400170475ffc94b46de52f565cc03f6971da8c42ab8ea84cd34ebf9c80f2eb322030eb72e64c84f528f5dfce85e8f4749f8d672220f45a48a2&i=&a=1)
Unpacked, ungolfed, and commented, it looks like this.
```
`]q~*}8x9uA3_P0O`jX         push ["fly", "spider", "bird", "cat", "dog"] and store in X register
{                           start iteration over animal list
  `p{+P91{m@Lwe\Jk?!#8`Yp   Store "There was an old lady who swallowed a " in Y register and print it
  .,.i!@+                   Concatenate "." on the first iteration and "," thereafter to the animal
  P                         Print
  i{                        On all iterations after the first, execute this block
    `r4uB2O'O(4XghNqE PhaMg^-riMgR{N>A8LfCNqh@Rn$=aHX|93@_5d?d7qp2-`
                        Push "That wriggled and iggled and jiggled inside her. How absurd, bird. Imagine that, cat. What a hog, dog. She died of course"
    ',`?~nA${F"`R       Replace "," with " to swallow a"
    .. /                Split on string ". "
    iv@                 Get the (i-1)th element where i is the iteration index
    '.+P                Concatenate "." and print
  }M                    End of conditional block
  x2B                   Get adjacent pairs from x (list of animals)
  i(                    Keep first i pairs where i is the iteration index
  r{                    Iterate over reversed list of pairs
    `_,m+"S3&#`p        Print "She swallowed the "
    Ep                  Print the second animal from the pair
    `p<qr?t`p           Print " to catch the "
    ',+P                Concatenate "," to the first animal from the pair and print
  F                     End iterating block
  `;p(9Cv,77BzpP'kB|"`P Print "I don't know why she swallowed that fly,"
  `%?/3.=iHiS6y!`P      Print "Perhaps she'll die."
  zP                    Print a newline
F                       End outer animal iteration.
yp                      Print y register. ("There was an old lady who swallowed a ")
`zvVH`P                 Print "horse,"
                        Print "She died of course." with an unterminated literal
`AJt6Q.3+$!
```
[Run this one](https://staxlang.xyz/#c=%60%5Dq%7E*%7D8x9uA3_P0O%60jX++++++%09push+%5B%22fly%22,+%22spider%22,+%22bird%22,+%22cat%22,+%22dog%22%5D+and+store+in+X+register%0A%7B++++++++++++++++++++++++%09start+iteration+over+animal+list%0A++%60p%7B%2BP91%7Bm%40Lwe%5CJk%3F%21%238%60Yp%09Store+%22There+was+an+old+lady+who+swallowed+a+%22+in+Y+register+and+print+it%0A++.,.i%21%40%2B++++++++++++++++%09Concatenate+%22.%22+on+the+first+iteration+and+%22,%22+thereafter+to+the+animal%0A++P++++++++++++++++++++++%09Print%0A++i%7B+++++++++++++++++++++%09On+all+iterations+after+the+first,+execute+this+block%0A++++%60r4uB2O%27O%284XghNqE+PhaMg%5E-riMgR%7BN%3EA8LfCNqh%40Rn%24%3DaHX%7C93%40_5d%3Fd7qp2-%60%0A+++++++++++++++++++++++%09Push+%22That+wriggled+and+iggled+and+jiggled+inside+her.+How+absurd,+bird.+Imagine+that,+cat.+What+a+hog,+dog.+She+died+of+course%22%0A++++%27,%60%3F%7EnA%24%7BF%22%60R++++++%09Replace+%22,%22+with+%22+to+swallow+a%22%0A++++..+%2F+++++++++++++++%09Split+on+string+%22.+%22%0A++++iv%40++++++++++++++++%09Get+the+%28i-1%29th+element+where+i+is+the+iteration+index%0A++++%27.%2BP+++++++++++++++%09Concatenate+%22.%22+and+print%0A++%7DM+++++++++++++++++++%09End+of+conditional+block%0A++x2B++++++++++++++++++%09Get+adjacent+pairs+from+x+%28list+of+animals%29%0A++i%28+++++++++++++++++++%09Keep+first+i+pairs+where+i+is+the+iteration+index%0A++r%7B+++++++++++++++++++%09Iterate+over+reversed+list+of+pairs%0A++++%60_,m%2B%22S3%26%23%60p+++++++%09Print+%22She+swallowed+the+%22%0A++++Ep+++++++++++++++++%09Print+the+second+animal+from+the+pair%0A++++%60p%3Cqr%3Ft%60p++++++++++%09Print+%22+to+catch+the+%22%0A++++%27,%2BP+++++++++++++++%09Concatenate+%22,%22+to+the+first+animal+from+the+pair+and+print%0A++F++++++++++++++++++++%09End+iterating+block%0A++%60%3Bp%289Cv,77BzpP%27kB%7C%22%60P%09Print+%22I+don%27t+know+why+she+swallowed+that+fly,%22%0A++%60%25%3F%2F3.%3DiHiS6y%21%60P+++++%09Print+%22Perhaps+she%27ll+die.%22%0A++zP+++++++++++++++++++%09Print+a+newline%0AF++++++++++++++++++++++%09End+outer+animal+iteration.%0Ayp+++++++++++++++++++++%09Print+y+register.+%28%22There+was+an+old+lady+who+swallowed+a+%22%29%0A%60zvVH%60P++++++++++++++++%09Print+%22horse,%22%0A+++++++++++++++++++++++%09Print+%22She+died+of+course.%22+with+an+unterminated+literal%0A%60AJt6Q.3%2B%24%21&i=&a=1)
[Answer]
# [Zsh](https://www.zsh.org/) + coreutils, ~~406~~ 375 bytes
```
g()ls -t<>"She$d the $1 to catch the $2,"
set bird spider \ swallow iggled\ 
<<Z
${b=There was an old lady who${d=$3ed} a }fly.${5=
I don't know why she$d that fly,
Perhaps she'll die.
$b}$2,
That wr$4and $4and j$4inside her.
`g $2 fly`$5$1,
How absurd${6= to$3 a }$1.
`g $@`$5cat,
Imagine that$6cat.
`g cat $1`$5dog,
What a hog$6dog.
`g dog cat`$5horse,
She died of course.
```
[Try it online!](https://tio.run/##5VTBTuswELz7K1ZoJUAKkfqAnlrgCDckkJ5UccDNOnHAjavYKOoL/fa@dRyghSI4IRCXyPJOdmdG6/nn9CojwL3ZvVezORzQvsikP0nz0WgirrWqFTTSgazAGgIjaQGNtuAaaYxtFIGE3CxScQFkq10P95VtGLEAp9UaymvpAzARl6rWcu5CfdcYoFKl4pOD3LwkVSeM5mZNXRaFCfcVwdrxrj@XlWM0cONUXL3iovpW4C2w2kx3dx29r9AxLWtKxDkPkFP3UFOg0df76jbK4X6T8JMf30wej@RBM1mUlYodN/RxeZu8LOJe@EaXfrAPZItE/A2dJGhbbLrAxW0uUMS9sO3M/A1uaVs7FVnxbwQ2h8w@8F0qJqJdFXv7xsGBH53sMAQjYRxsksU/yY5wykfVvZybZ9djMtyACNmG7XT8LjNsaYyHipZMbBnyDdvj8VYb8EP5OF0yr6fQwqMQUvF7h0frKXVbsIDQ6BaPcbAeENgOx6wUDwMdHEToGcPePDUcds@L62FDcMCYV2uIw271GBF2jVEMed/71UQsH71SkBaCyjyH9JTdG@Hp6j8 "Zsh ‚Äì Try It Online")
Tricks:
* the `g` function creates the line as a file and then `ls` lists the files in the current directory in order of creation (`-t`), to avoid having to repeat the previous lines every time.
	+ I used `<>` (which creates the file before the command is executed) instead of `>...;` because using multiple commands in a function requires `{}` around them
* `set bird ...` assigns the words to `$1`, `$2`, etc.
* `\ swallow` includes a space at the start of without needing to use quotes
* `<<Z` starts a heredoc which is effectively a long interpolated string
* `${b=There...}` is a shorthand form setting `b` to that string and substituting its value in
* Indexed variables like `$1`, `$2`, etc. can be substituted without a space afterwards (rather than being interpreted as a variable called `5dog`, for example), so we prefer them as it allows us to include the space inside the assignment to avoid repeating it
* `g $@`: since we set `$1` and `$2` to `bird` and `spider` respectively, we can pass all the numbered variables to `g` in one go with `$@` instead of `g $1 $2` (it ignores the extra ones, `$3` etc.)
[Answer]
## Haskell, 515 498
*Score does not count newlines and spaces added for presentation.*
```
b c a="There was an old lady who swallowed a "++a++c++".\n"
t r a=b(",\n"++r++" to swallow a "++a)a
s(a,b)="She swallowed the "++a++" to catch the "++b++",\n"
z=["fly","spider","bird","cat","dog"]
h=[b"",b",\nThat wriggled and iggled and jiggled inside her",t"How absurd",
 t"Imagine that",t"What a hog"]
v(g,p)=g++(=<<)s(zip p$tail p)++
 "I don't know why she swallowed that fly,\nPerhaps she'll die.\n\n"
main=putStr$(=<<)v(zip(zipWith($)h z)(tail$scanl(flip(:))[]z))++b
 ",\nShe died of course""horse"
```
### Ungolfed:
```
type Animal = String
type Comment = String
beginning :: Animal -> Comment -> String
beginning animal comment = "There was an old lady who swallowed a " ++ animal ++ comment ++ ".\n"
ending :: String
ending = "I don't know why she swallowed that fly,\nPerhaps she'll die.\n\n"
to_swallow :: String -> Animal -> Comment
to_swallow start animal = ",\n" ++ start ++ " to swallow a " ++ animal
swallowed_to_catch :: (Animal, Animal) -> String
swallowed_to_catch (a, b) = "She swallowed the " ++ a ++ " to catch the " ++ b ++ ",\n"
animals :: [(Animal, Animal -> Comment)]
animals = [("fly",    const "")
          ,("spider", const ",\nThat wriggled and iggled and jiggled inside her")
          ,("bird",   to_swallow "How absurd")
          ,("cat",    to_swallow "Imagine that")
          ,("dog",    to_swallow "What a hog")
          ]
-- Turn [1,2,3,4,5] into [[1], [2,1], [3,2,1], [4,3,2,1], [5,4,3,2,1]]
trail :: [a] -> [[a]]
trail = tail . scanl (flip (:)) []
verses :: [String]
verses = zipWith verse animals (trail $ map fst animals)
verse :: (Animal, Animal -> Comment) -> [Animal] -> String
verse (animal, comment) swallow_chain =
    beginning animal (comment animal) ++
    concatMap swallowed_to_catch (zip swallow_chain (tail swallow_chain)) ++
    ending
poem :: String
poem = concat verses ++ beginning "horse" ",\nShe died of course"
main :: IO ()
main = putStr poem
```
[Answer]
## Python, 484
Ok, I did it but was pretty boring...
The last sentence is always with "fly" so some chars were removed...
```
f,s,b,c,d=o='fly spider bird cat dog'.split()
x='There was an old lady who swallowed a %s.\n'
t=' to swallow a %s.\n'
r=['That wriggled and iggled and jiggled inside her.\n','How absurd'+t%b,'Imagine that'+t%c,'What a hog'+t%d]
t=("She swallowed the %s to catch the %s,\n"*4%(d,c,c,b,b,s,s,f)).split('\n')
print("I don't know why she swallowed that fly,\nPerhaps she'll die.\n\n".join([x%f]+[x%o[i]+r[i-1]+'\n'.join(t[-i-1:])for i in range(1,5)]+[''])+x%'horse'+'She died of course.')
```
Less golfed version:
```
f,s,b,c,d = all = 'fly spider bird cat dog'.split()
what = 'There was an old lady who swallowed a %s.\n'
t = ' to swallow a %s.\n'
comments = ['That wriggled and iggled and jiggled inside her.\n',
            'How absurd' + t%b,
            'Imagine that' + t%c,
            'What a hog' + t%d]
swallowed = "She swallowed the %s to catch the %s,\n"
lines = (swallowed*4%(d,c,c,b,b,s,s,f)).split('\n')
end = '''I don't know why she swallowed that fly,
Perhaps she'll die.\n\n'''
def who_catch_who(i):
    return '\n'.join(lines[-i-1:])
p = end.join([what % f] + 
             [what % all[i] +
              comments[i-1] +
              who_catch_who(i) for i in range(1,5)] +
             [''])
print(p + what % 'horse' + 'She died of course.')
```
[Answer]
# C, for fun (561 chars)
  
*Score does not count newlines and spaces added for presentation.*
Thanks to J B for his improvements!
```
#include <stdio.h>
void main() {
    char *e = "\nShe swallowed the cat to catch the bird,\nShe swallowed the bird to catch the spider,\nShe swallowed the spider to catch the fly,\nI don't know why she swallowed that fly,\nPerhaps she'll die.\n\nThere was an old lady who swallowed a ";
    printf("%sfly.%sspider,\nThat wriggled and iggled and jiggled inside her.%sbird,\nHow absurd to swallow a bird.%scat,\nImagine that to swallow a cat.%sdog,\nWhat a hog to swallow a dog.\nShe swallowed the dog to catch the cat,%shorse,\nShe died of course.", e+191, e+128, e+85, e+41, e, e);
}
```
[Answer]
**C#, 556 chars**
```
class P{static void Main(){string a="There was an old lady who swallowed a ",b="I don't know why she swallowed that ",c="She swallowed the ",d=" to catch the ",e="Perhaps she'll die.\n\n",f="fly",g="spider",h="bird",i="cat",j="dog",k=",\n",l=".\n",m="to swallow a ",n=c+g+d+f+k,o=c+h+d+g+k,p=b+f+k,q=c+i+d+h+k,r=n+p,s=o+r,t=q+s,u=e+a;System.Console.Write(a+f+l+p+u+g+k+"That wriggled and iggled and jiggled inside her"+l+r+u+h+k+"How absurd "+m+h+l+s+u+i+k+"Imagine that "+m+i+l+t+u+j+k+"What a hog "+m+j+l+c+j+d+i+k+t+u+"horse"+k+"She died of course.");}}
```
[Answer]
# Perl, 489 chars
```
sub Y{$t=pop;my$s;while($b=pop){$s.="She ${W}ed the $t to catch the $b,\n";$t=$b;}$s.=$l{fly}.$/;}$W='swallow';$w='iggled';$q=" to $W a";$o="There was an old lady who ${W}ed a";$h='hat';@f=qw/fly spider bird cat dog/;@l{@f}=("I don't know why she ${W}ed t$h fly,
Perhaps she'll die.$/","T$h wr$w and $w and j$w inside her.","How absurd$q bird.","Imagine t$h$q cat.","W$h a hog$q dog.");map{$m=$f[$_];print"$o $m,
$l{$m}
",$_?Y@f[0..$_]:'';}0..$#f;print"$o horse,
She died of course.$/"
```
[Answer]
# [PHP](https://php.net/), 344 bytes
```
<?=gzinflate(base64_decode("5VAxTsQwEOz9iu2uifIO6JA4iXovu2cbjPdk+2Tl96zjoLugFFQIRGfNjGdn5ug4MVTMgBEkEASkGaoTyBVDkMoECOcwj+YRSOKhwFuUqooZsuM7VXFYmnAwT5wcXnLjDyEAeR6NOX7rUL544jSoWs1q8taGhkeCu+fr+vYxqxrUeDTPX7LwagVFYMIyuQVb4v1Ej5NPNJgHPYCnfE3UYqz8yu5Fbvg28Ocev6yentRD72h95O646af0Xr2p6255+0p/eAcSO5iX5oTgxG5XUHJvBeq6W9plzP+wlpOUuafSbwRyhkmuio0f"));
```
[Try it online!](https://tio.run/##BcHJcoIwAADQf/Gkw6FKSZBpOx1UQC0QZBN66QAmrBIQw/bz9r0ma16vz@@vdM5rUkVPvIyjDkPh74YTesPLBfDl0e0ug4JmKWc8y8kJwbMs5AHtGZ/EhXUrOd6tJDgXVGepql5OtkbMQrvVgKWC4btGulNKRXZKLaLutPMPpUGVPUqGggttB/1kg8q8ltLfjhmiH6jhvZYHFwxJUOvFYVJkbEMTBeLD04EgFA69dpt2@4y0rMR7xpEH14djOz48fHCtQNSHKPXV0DhN7OLHQr9RCmBa5jk9WuG@Jsq7F7bzdmJAjfuU36IE93DC9dM@iHwmAQQFGJF18OAbyAPArZs3LCcOAnkAqJuOGgi847nf4RZepaaaLW6oGuSxiDjxYE9ZeWc5XZPFavXxev0D "PHP ‚Äì Try It Online")
# [PHP](https://php.net/), 405 bytes
```
<?=strtr("0fly.
106That wr8and 8and j8inside her.
23107,
How absurd57.
274623109,
Imagine that59.
2947,
27462310dog,
What a hog5dog.
2dog49,
2947,
27462310horse,
She died of course.",["There was an old lady who swallowed a ","I don't know why she swallowed that fly,
Perhaps she'll die.
","She swallowed the ","spider to catch the fly,
"," to catch the "," to swallow a ","spider,
",bird,"iggled ",cat]);
```
[Try it online!](https://tio.run/##XVDPS8MwFL7nr3jkMoVQOu3WFRWv7iZs4EE8vDVZE41NSTJC//r60k1kXh7k@/W@l0EP0/T4/BSij/6Gl0c7FmxZrvcaIyS/wV7CPD43pg9GKtDKF@zuflnWgr24BHgIJy9XNYF1tc5EI9j2GzvTK4gUs2qIaiqS/wqk6wR7yxsQtOtW9CYJzYqs11LtfFCC7bQCaZQEd4TWnQgruHjneyqjIGEA7MFZCRblCEk7CAmtdYkcCFzwLUjXLyJ89dQ46RECBf5pck2g0wV7VV7jEDK/sDbvLBijgN0/vcqpYaAP8RAdtBhbPcNzCnHX6AW4JJw7nd1ZfDBeCm66zlI2F2T7uH2Yph8 "PHP ‚Äì Try It Online")
[Answer]
# Bubblegum, 255 bytes
```
0000000: e0 04 85 00   f7 5d 00 2a   1a 08 a7 55   8e 22 31 d2 ‚îÇ √†...√∑].*..¬ßU."1√í
0000010: cb f7 30 fa   52 4d 88 81   61 e4 be 9d   c2 f0 0e f8 ‚îÇ √ã√∑0√∫RM..a√§¬æ.√Ç√∞.√∏
0000020: dc c9 de 24   63 c9 1f c7   f7 71 e4 ed   40 68 0e d2 ‚îÇ √ú√â√û$c√â.√á√∑q√§√≠@h.√í
0000030: cd 76 d8 d9   0d 61 78 f7   40 cf 23 95   48 e9 be 27 ‚îÇ √çv√ò√ô.ax√∑@√è#.H√©¬æ'
0000040: aa 75 57 ff   51 9e 1f 1f   25 d8 93 4d   18 69 c9 01 ‚îÇ ¬™uW√øQ...%√ò.M.i√â.
0000050: 12 16 ec c1   ff e0 01 7e   fa ea 1e cc   84 d7 58 b8 ‚îÇ ..√¨√Å√ø√†.~√∫√™.√å.√óX¬∏
0000060: 47 d4 40 b4   ff c7 64 a9   2f 07 bf 7b   f4 25 74 94 ‚îÇ G√î@¬¥√ø√ád¬©/.¬ø{√¥%t.
0000070: af da 8a fc   0c 18 81 58   b8 3c 2e 97   c0 9d e8 27 ‚îÇ ¬Ø√ö.√º...X¬∏<..√Ä.√®'
0000080: 3e 02 8a d2   1b 7c 94 cc   cb f4 05 7c   c7 77 f3 75 ‚îÇ >..√í.|.√å√ã√¥.|√áw√≥u
0000090: ea 7e 02 d6   3a 84 5c 4e   1f 88 e7 03   9a 1d 3f 13 ‚îÇ √™~.√ñ:.\N..√ß...?.
00000a0: a6 9f 2e cf   be 77 16 be   f1 5f 01 52   cf 13 89 b3 ‚îÇ ¬¶..√è¬æw.¬æ√±_.R√è..¬≥
00000b0: f3 8a f7 90   18 08 50 99   27 f7 83 d2   a4 32 08 76 ‚îÇ √≥.√∑...P.'√∑.√í¬§2.v
00000c0: ef b4 99 6c   80 dd 1a 47   04 26 fe b1   02 b3 d4 e7 ‚îÇ √Ø¬¥.l.√ù.G.&√æ¬±.¬≥√î√ß
00000d0: 3d 44 3a 64   64 46 39 77   35 61 6b 6c   7b 68 34 db ‚îÇ =D:ddF9w5akl{h4√õ
00000e0: 51 75 39 2e   bc 46 8e 96   d1 8a 4c 79   f4 7a 7b e0 ‚îÇ Qu9.¬ºF..√ë.Ly√¥z{√†
00000f0: f5 44 85 eb   ef 68 d5 22   26 4a 2a ef   fc 60 00    ‚îÇ √µD.√´√Øh√ï"&J*√Ø√º`.
```
[Answer]
# [Python 2](https://docs.python.org/2/), ~~453 442 427~~ 387 bytes
* **@nore saved 11 bytes:**  Thanks a ton!!: pointed `¬£` used before was a double byte char!!
* saved 15 bytes: `swallow` shorthand
* **@nore saved 40 bytes!!!!!** THANKS A LOT!!!
* @Zachary T saved 1 byte: space between `in` and `"..."` removed
* Thanks to notepad++'s find and replace tool. ;)
```
r="%2(:0)That wr66j5 inside her(_1)How absurd+1({3)Imagine that+3(}4)What a hog+4(~4*3)}horse)She died of course."
for i in"}~3*1){!{~1*0)_!_~0*2):!:^2)$%!~She7ed the !%There was an old lady who7ed a !$Perhaps she'll die(\n!* to 3ch the !^I don't know why she7ed that !+ to7 a !(.\n!),\n!0spider!1bird!2fly!3cat!4dog!65 and !5iggled!7 swallow".split("!"):r=r.replace(i[0],i[1:])
print r
```
[Try it online!](https://tio.run/##JZBPi8IwEMXvfopJUTZppfSfCgXv621hhT24KrGJTXazSUkipYj96m6KlzkM7/fevOkGL4wunk@7jRYFrjOyF9RDb9frnxVI7STjILjF55y8mx7oxd0sS3J8L8nuj7ZSc/CBSEr8qMjXxFIQpk0qPFZxSR7CWMfJp@DAJGdgrtCYW1il0exqLMiQET3GMs7JHd3HPM7IGZ3HLC5IjepTQeYLNAZ6E1gfTNBiH67h0FMHVINRDBRlA/TCTBIKaP7BraCdAyf4m1JTLP7WKAZvoGzEy@W0A2b0m4dfHUr1YpjUr4zQACVBvJnMcBpQsgwjc114hUX5RVqGiqsaUNlQjypmWrRehWMYoJVsW8UZ2oDrqVKmj1LXKelxhCJS261NLe8UbTiWh@y4lIe8PpJZZ6X2YJ/Pfw "Python 2 ‚Äì Try It Online")
[Answer]
# Groovy, 475 bytes
```
b="swallowed"
a="There was an old lady who $b a"
c="I don't know why she $b that fly,\nperhaps she'll die."
d="She $b the"
e=" to catch the"
f=" to swallow a"
g="iggled"
h=" spider"
i=" fly"
j=" dog"
k=" cat"
l=" bird"
m="$d$h$e$i,"
n="$d$l$e$h,"
o="$d$k$e$l,"
print"""
$a$i.
$c
$a$h,
That wr$g and $g and j$g inside her.
$m
$c
$a$l,
How absurd$f$l.
$n
$m
$c
$a$k,
Imagine that$f$k.
$o
$n
$m
$c
$a$j,
What a hog$f$j
$d$j$e$k,
$o
$n
$m
$c
$a horse,
She died of course."""
```
Nothing too interesting, just a lot of string interpolation. Golfing tips on this one are welcome!
[Answer]
# tcl, 451 bytes
```
lassign {\ swallowed fly, spider " to catch the " bird cat iggled " to swallow a"} W f s c b a i w
puts "[set t "There was an old lady who$W a "]fly.
[set I "I don't know why she$W that $f
Perhaps she'll die.
"]$t$s,
That wr$i and $i and j$i inside her.
[set S "She$W the "]$s$c$f
$I$t$b,
How absurd$w $b.[set v \n$S$b$c$s,\n$S$s$c$f\n$I]$t$a,
Imagine that$w $a.
[set X $S$a$c$b,$v$t]dog,
What a hog$w dog.
${S}dog$c$a,
$X\horse,
She died of course."
```
Available to run on: <http://rextester.com/live/GXF89639> (10th attempt)
[Answer]
# [PowerShell](https://github.com/TryItOnline/TioSetup/wiki/Powershell), 349 bytes = Script:9 + Archive:340
```
tar xOf t
```
[Try it online!](https://tio.run/##5VRBTsMwELz7FStxCEhp3lAJCegJpCJxdu1NbHC9ke0QUvH3sG6C2qIeOCEQN3t2PDszB7fUY4gGnRsvxbIQjwYDQi8jSA/kNDipB@gNQeylc8zWIKF2QyVWoMkXCV489cwYgGWOWMnIlImleMBgZBvzvHAOtMVKfHNRbK3GUDKbxfpgm8Zl3Gs4Oj7PZ@sjs4GFK7H@4gVnKUgESiZl9tje3k/k2NigS3HHC@QmdkFnG/N8np6znPFTw599/LJ4vJIXbWVjPU6KJ/l4fC6emngHv1NLf7gHTU0pnrKSBEPNaQs8PNeCnngHt/sy/0NbhkLEyRU/00A1KOoYq0SxFFfwDmtMi2vyCT1vg8UNBYUiyQA7VRMwJm4zw1inVwm3UJcJLoC61HaJvwPmyA3fQAZl7CsHsDsc8/u3@xrSOH4A "PowerShell ‚Äì Try It Online")
The Powershell script to create the archive `t` (see TIO):
```
(
@'
There was an old lady who swallowed a fly.
I don't know why she swallowed that fly,
Perhaps she'll die.
......
There was an old lady who swallowed a horse,
She died of course.
'@
) | Set-Content f -Force
tar zcfo t f
Get-ChildItem f,t # output info about archive size
```
[Answer]
# [Wolfram Language (Mathematica)](https://www.wolfram.com/wolframscript/), 295 bytes
```
BinaryDeserialize@ByteArray@ToCharacterCode@"8C:xœ√•PAN√É0<√£W√¨¬≠—(√Ø€R‘8o¬≥[√õ√Öx+;••√∞n√ñq¬™6(N√Ñ√çš√è√é√å√æ√£√°√Öqb(˜#H H'ê
† …	Ža√™√çê√Ñ√ùoQŠ*&√àŽ√ØT¬£√É¬±
;√≥√å√â√°9W~ê√ß√û˜√Ø
√ägOœ:U¬´YI√û√öP√±Hp√∑<-o¬≥¬™Aç{¬≥√ø’…+
7cs¬ºŸ√®q√∞‰:√≥¬®√∞ê/‰jŒ…_√ò¬≠√à_¬æ√Æ√±√ã√™√©I=√¥Ž√ñGnŽ¬´~Jo√ïš√Æ–¬∑¬≠√¥‡w ¬±ùy¬≠NN√¨z%¬∑V¬†¬¶¬ª¬•ù√á√ºk9I™[*√ΩF G√§¬¢X√ø	T√ø”\""
```
[Try it online!](https://tio.run/##DY7RS1NxAIUpsM16UNDQsOiyKIcS9WQ6DTYnuvWwZswsDMavedFbuduuF3IGEuhVZ26taGtOZ9mybDrnuMIeNIVz/rB1387Ddz6@GaFPyzNCVyKiHtSUqC6564NKVGjxIXlW1hTxRpmX3YNxXfZomoi7Q6p3WmgiosuaV52U3Y5er2sOW9wNegJcvN88wOI4D1DGNycr@NDxBJ97VZgT3KQx192PDDJNPIoyG0Opx2kL2LnEJPLX@IkprvOMRe7QiL10Infhlk@y@1paO5G@gmUJRmMzUoIlJluQtm4FuzqKta47XEWKlRCKXET1cj9Ny5PgTt/4QttFC/zDbeRYucG1qcfYco1h/7mf28wHWfW9ZW3grnoTJkoeJN/D5Dm@wGjrbm@4dN32IDKLU3znXoxHSLhoYs9mrfQ9JF5hHUaYOZS5ejVswxkPWeVHK@6v/yGPraDsSBQp7C88UpnpQJ6HyKJm4cdYeSehikIc5YA9wIP5htuoPcUP/MYJdlHgCk@bXvf5sTHRxX/D0kg7f@HnM543hqy6ry8cjnr9Pw "Wolfram Language (Mathematica) ‚Äì Try It Online")
This solution is a 46-byte decompressor `BinaryDeserialize@ByteArray@ToCharacterCode@"..."` acting on a 248-byte array masquerading as an ASCII string. Transferring this string between different programs is a bit tricky. TIO, for instance, blows this solution up into 416 bytes using UTF-8 encoding instead of keeping the ASCII string. To get the minimal 295-byte solution, save the text in a variable `text` and run
```
BinaryWrite["ThereWasAnOldLady.wl", Join[
  ToCharacterCode["BinaryDeserialize@ByteArray@ToCharacterCode@\""],
  Normal[BinarySerialize[text, PerformanceGoal -> "Size"]] /. {34 -> Sequence[92, 34]},
  ToCharacterCode["\""]]]
```
then execute the generated file on the command-line with
```
wolframscript -print -f ThereWasAnOldLady.wl 
```
[Answer]
# [C (gcc)](https://gcc.gnu.org/), ~~512~~ 493 bytes
-19 bytes thanks to ceilingcat
```
*s[]={"That wriggled and iggled and jiggled inside her.","How absurd to swallow a bird.","Imagine that to swallow a cat.","What a hog to swallow a dog.","fly","spider","bird","cat","dog","horse"};r(i,x){return i&&r(i-1,!printf("She swallowed the %s to catch the %s,\n",s[i+4],s[i+3],x&&puts(s[i-1])));}f(i){for(i=0;printf("There was an old lady who swallowed a %s.\n",s[i+4]),i<5&&puts("I don't know why she swallowed that fly,\nPerhaps she'll die.\n",r(i++,1)););puts("She died of course.");}
```
[Try it online!](https://tio.run/##XVDBbsIwDL3zFV6klWYUBNp26riP26Qh7cB6CE3aZAtJlaQqqOLbmcOKBsvBsWPnvedXTuuyPJ0e/KZY9mQtWYDOqbrWggMzHK7SryFXxisuQAo3Ixl5tR2wrW8dh2DBd0zr@AJb5Xjsr3asVkZAiNA3EyULceAjNhhIW9@2ua1ju9IHjL5BSodJhMUL/2LEEYzSOi/IMXepyva0dyK0zoBKEnyYLrK7xikTqpS8S3GBxy0CVvc@UiJWKYc6@zQk8xs1eSrO12OR7ZOkaYNPsZwuCkppfqxSRfvKIv5ynl/g12iIgI55NAus5qAZP0An7RUpQ4rZHwXN1MvzAE9WuLEZB/g2uH4nD@D/6UWb0AxU@CacZI2PA2OtgStxxkQ5k0m2QIE0/4WMG2OXg62gtC3aNCMo/4SCYceUSSn0I8BTpTQ/J4N583x0PP0A "C (gcc) ‚Äì Try It Online")
[Answer]
# [05AB1E](https://github.com/Adriandmen/05AB1E), ~~516~~ 408 chars
-108 chars by not restricting the allowed characters to CJK Unified Ideographs Extension B
```
"ÓÄàÛç´úÒê∂ÜÚÖè†Úû±¢ÒæáúÚÇ∫∏Û∞®ëÚâ∂úÛãäï°ùà≤∫æÒíùßÚù≤âÙå±ØÙàôΩÛóòµÛÜà™Û©ô≥ÚèêóÒ†≤øÛòÖπÚô¥≤ÚüùéÚèàÆ´õÆÚº∂≤ÛõâºÒöõºÒ©ùÜÒ¶àøÛ°∂àÚßäÑÚø¢≠ÒºµÇÒ¥£∞ë¥¶Òπø≥Ûê£áÒÇùèÛíÖßÙÉúÅÚñªåÚè∑æÛ†âµÛïΩá†ÉóÛè¢πóøÑêΩ¢ÛíàèÚêÑèÚÇøüÚé†øÛå≥èÒì¨∞ÙåéáÚóøÄÙáú†ÒôèºÚö∞¨ÙÇííÛò°ΩÙà≤ÇÒ∏≠àÚñç®ÚÑÅôÚä•àÒπàßÚÄáîÚ¨ü™ïÉùÛØòíÆ®âÚµõôÛü©∂ÚùÇèÒâ¢ºÒíøæªúíÙàè∏Ûú±øÚ®ô®üå®ÙÄ°Ωú¥ÇÒ∑ü†º∏ØÚû∫ØÚ™∞©ÚáøôÙå±äÚñÄ∏Ûõ©Øê∏ùÒï¶Äóå¨Û±©≤Ú©π∂Ò¶àÑÒÄßêøÇâÛ∞§ßÒ±û©Ûáà∂üù´ÙéüÉºßïÒπΩñÚ•§≠ÛÖ•ö≠õ®ÒØñÖ•µ∞Ó£øÛóÅÑÒú§àÒõ©æÚà∫ºÒ©íâßìßÒ≥°†ö®Ö¨ÆæÙã°àÒ≠Ç≠ÛßöùÛ¨¶ÄÚΩû≤Û≥∑ëÚïöíÛ≤´¨Ûú£°ÛåáôÒÄø∫ó®ªÒÖé±ÙàôÜÚå£≥ÛØëÄÛØ©åÛ©ÑÄÛ¥æèÚÇÉªÛ∫ùºÚÄô£Û´¥ãÒ∂è©Û¶≠ÖÚπ∂ÆÛπù≠Úò£µÚææ≤ÚÄè†∞ÆÑùúü¥Ñî§â∏≥∞†Ú¶≥´ëáàÛØÉùÒÆ™∑ÒêºáÛêîèÛø†≤êÜ¨Ûé∞ñÚÖÅïÒùæó¶¥ÉÛ∏´£ÚáãøÒ¶â¨Ú±íéÛóò°Û∂Ü£•™ÅÛùñåÛ™¨Ç≠°éÛÑéïÛù£òÙÄïπÒòéìö¢óÛ∂ß¥ÒÑ©ìÙÇ™éÒë¶≥Ú¨™≥Ø®ØÛõ©ÉñöûÛï´ØÒó≠øÒãßâÙÄ••Òô©§ùë∏Ûá±åÙÖßπÚ∞ñÄÛèÉãÚû∂òÚöì¶Ûå∂ôëå®Ò≥¶¥Úº´∞ÚüªñÚÇ™∑ôÑ¢Ú´ìéÒÑûõÛãπÜÛæúßÙäªûÛÑëÄÒõòÅÚÅÄ∂•®™Ú∂ì£ìåÉÒõëïÒü≤ßÛë§£Úä†ØÚÜπ†Ú∑†∂ÛúöπÙÄ∑¶Ú•º¥Òªπöù∞ß©¢ÄÒêöåë®Æôé¢ÒüèäÛ∂Ø°ÛïÑÇ≤öÜÛ∂ñâÛ¶Ä§ÚîΩêÚπ≥úÛ¨î®ÙÑ°°ÒÅ∂èñûëÚÑ≥ü¶≠äÒÜñúÒó∫ÑÒá£¢Òπì®Ò©ΩÖÒ≥åæÚ≥ôôÒΩÅªó≤µÛéò∫†ΩéÚÄñªÛåáôùóÄÒ∂ß¥Û∑±≥Ú©±Ñ¢†äÚºíê∂å•û∞™™â∞ÒüÜØÚçê≥ïüÑÒ¥¥ïÚöòôÛ≠ÆõÛ≥ùºÒº£ÆÒâ∏ÖÚº∫¥êªôÚóäéÒ´ê™Ú∞ä¶Ûª≠∏ô°§ß¨öïöæÙçê†Û¢ä¨ÒÇëΩÚü¨Å∂ãèÒÆòéÛæô∫"√á≈Ω√°√°-‚Ä¢GŒ±m‚Ä¢Œ≤‚ÇÜB≈Ωm&",.' 
"‚Ä°"ÓÄîùπáÚù¢áÛ∞¨æÛπ≠üÚ™ÑôÒóúÇÚó°Öû¶ÇÚΩáéÙå°±Ûº≥•Úºµâ∞ãàÚ®óÑ•ÖåÛ´†ùÛîåìÛÑØáÚëçòÛè≥ä∂ÉÄÚ±º∫õí¥Ò•ª≥Ú≤âåÒ£µÜÛæ±ßÚº£πæ±´†ÉÄÛ∂∏¶Òùó∑Ûê∑ÆÛú≥Ñ∫∫Öª≤ÜÛ≥àÜÛÖ±ÉÚû†©Ò¥∏πÛ¨ÆΩÚ´ØåÚ∞∂¢Òùâ´ÒÜ•¶Ûüæ®ÚóïºûÖÄÚòÇ®ÙÅå£ß§ÄÚöÇÖÒíé†ÙÉ∑ÜÛñ±éòº®¨øäÛôµ≤Òè≠âÒºÄÄ"√á≈Ω√°√°-‚Ä¢GŒ±m‚Ä¢Œ≤bT‚ÄûAa‚Ä°.√è
```
[Try it online!](https://tio.run/##bdRL0qqIHQXweVaRuoNkkvQekkk2kA10V2XQg64MsgFEEFA@8PEpoiLgg4eiIiiKog5u9bQXcRfQ9X8wvzHzjM78d06df//nx59@/tf3719@F1T@2M6wW7RINj2aHxf4VGYk3q6cRj3Sihl32kPwHRWy2xP7TkhOptX68VCr9oOt8Zlb6oZjOyeza6GXvXgsl2SfMnIdg0x1D9vpnqoi46lW4WRaYey0MFBf7BcqhW2JXosdVmcRT8sUeqcAy1fO3aWComNyXw7r5qxBo7tO5uXJnnbm4UMBr2mxuSjBeknQfSy4r5rUlUwSXy4Z3ov13MRBkta6oZD1Empl5qFtVjRJk1rs93nsP2o1E/G6U2n0EZHUsKm9VrFUQxKUT0rcDQybDh/GfdhHGp2nNrtxQY5ooraosP96wn3Wr1XzyrPjiyI7AlePasF/wOwk4sX1oLoeaH470CaNSXnZb7M2jYQrT@MDdK8ODgMBLD3hY5xRXBZvEwmFsAsvUeN0FeJxHrOiFuA629pwm1CFQywfI1qvdiyvJ7CbRngYybA@p78vX2w1JJytVJzGT1Jvb@a@BuEgxNz3YBLJkOyfdcdXcSfuOJw4nAQCPeYZ55ceDSd9zrYJz5Y@64qNwusGVnRH2Ti@a26Rvsz50BP4EOscSwKfnm/q5p1vTkWCveTtqYOFGXOwk6ks9lw6Oxovz/R8ZiSYHqR7CZyZCyfpE1baFfLUoyDfQk9R@dB0cL@5YLdSuPtp8svLoNtK2EhHJDeG6DwtCE5Nvm6XpHReGGgJHfvGe3o@F60lrDcNdkY6bxIRdr7BkjFkZzmuhWGJY2MAk4XFRXhCKR7U4sbAXpBTssnhEB3eVTRhNJnzcHtAa/fCTqjVwnqNdrwCp3dl5ajXclhSOhLYbHZoXoxpMghYL2zo6RHmwYmqbUrufUTi5gK2tKDtwEBpPuVO2eLnLKzb9zlLPQGn4wY1hALW0YaKwRIGehOnvSG6Wci91ZLa3oFapUcXr@DZpKyFS0Dr6oT3cgJOGkK8ELA70aEX7cE2FuiabS4OPg8lEbJJi4uRxoGwos9Hl8p8xslnVEu@j43ChNG8R1LuQrBrY2s0Q@smobJcYDmIMH7ImOtPym0bH407WNmZjfENvIdBwuj@vz2AYwn4NuTLMaf4KMHCa1PV70Khr2GebmCjpei2DvTRzWHoSng6DWkytnm3n3LuVFgt96hdZapuJ@jebbLaBm67G0rbAd93V7D9FYTJBIaTZ/3R9XjRTlDsPchNGlB0TNyPDX7aty9flV8fX/2v/l@/CYt//Hb85R2/Zd/E1t9/ffzypy9/@eHPf/zDl2@C/761T3BKhZyFwmny5HLn0kay0ZqJZPkyzAORHopR6/6Rq3xN1VmDtKNSZEmwlnXeeg5/6gOWDgr1PsZs5m0omgIdqxtM@ydc33PKNB2X53fHx5CqZQnP4/Z9SwIX1wAd68Ldy55nuQS3mwz3rMW52mL52KS5F@PpWnKyf9D2oFNaLNDRtthaB@w@I7KGFcxlgcZiVDf0JYQrgSaijH3Dq5uXFo@OBoyrCJJXm@1zhuZOw0oQ/r/NT//8Jsz/9uPb5Iev5vfv/wU "05AB1E ‚Äì Try It Online")
This exploits the fact that this is an old question that counts in chars.
# Version without using UTF-16 strings, 925 bytes
```
‚Ä¢*‚Ñ¢w8?√°Z–º<r¬º√ã}√àdE√Ñ≈∏‚Ç¨KŒ≤;‚Äô√å√∑`‚ÇÜN√ãr;O√ô–ΩŒõ¬§√∏oE~√ù√π√á?}6√Ö¬±T√∑EƒÅ2¬≤√Ø√°pK|¬Ø√ê‚Ä†ÀúCY√Æ√¢√ÄJ¬Ø√ê‚ÇÖ‚ÄúŒªÀú'=\‚ÇÉ0ÀÜN‚ÄπBM¬©–ºe¬Ω√å¬Ω√ú√ô√à?QXt‚Äù
v¬¥q√ò√∫!√æ3$√≤≈°p√¥/‚Äî√®i_√∞@tŒ≥¬µ√∞B}¬ØS‚ÇÑ6¬¥>√ùN¬ØŒ∂l√ß√¶‚Ä°¬º¬∂¬ßƒÅj]\0√æGwN‚ÇÅ<√¢X1o∆µ[√íg¬≥K√ì‚Äπ√¨‚Äö√º√ø‚ÇÉ1E¬Æ√åŒ∑ í(Œî√ÉŒª√ãX≈íl¬µV#‚ÇÉ √é¬§√ù¬¥√∂√∑Œµ_%C+z√ù-C-‚Ä†¬¨‚Äòm√∂¬πz‚àç¬≥«ùq‚Ä†‚Ç¨T í‚Äû2≈æU√û>√è¬©Œπ‚Äπ√≥‚â†√ø√∂√¨‚ÇÜ–Ω‚Äî‚ÇÉ\–ºƒÅ9√æ6jŒ©√õŒ≥‚Äû‚Ç¨L√ô√ê¬æYm9√Æ√Æa√º¬±¬µ≈í≈æ√ñ¬ª≈∏√¶√ó√ß√Æ√≥√∫¬Æ√π≈Ω√ä>√î‚ÇÑG√∑5Œõ‚Äös√ô‚ÇÜ=√∏Hl√£sP√è√ò\¬¨¬ªE‚Ä†¬Ø√Ñ√á≈†P@¬°≈†√Å*√ë‚ÇÅo∆µ¬∞e√∏¬æ√ô‚ÇÇ√é√¶‚ÇÇ.√Ç(‚ÇÖ‚ÄùuCDr‚Ä°‚ÇÉO√æR‚ÇÉ√Ü-&√ë√¢√Ä‚ÇÑÀúg¬æ√æ;q‚Ä°8}5,z‚ÄîH√∑‚Äπ}√ûj√¥&‚ÄûHKF√à‚â†Œò√∫ƒÜ0¬∏aJ+b√†G√àz√û√âY4w-/√ä‚Ä°Œ±_√ô$!i¬±‚Äî√æq9«ù*S–Ω«ùŒ∏eBQ√ëK+}‚Ä∞√ù‚Ä∞‚Äî‚Ä°Œ©¬∂Œ£x¬¢32D√ì‚Ä†v¬™‚Ä∞√ç%–∏t5≈æ*|√é√¶)¬≥‚ÇÑ¬°N√ΩX–Ω¬¶¬Æ√á√É√æ¬∏.¬∏√≤8r¬¢‚Ä∫¬ße‚Ä∫√å"P‚ÇÜ∆µƒÅ√ë√ñ¬∫jŒ£~√Ø`
‚àû√•≈íw√Ø√¨s√ê¬∫‚àäƒÅ‚Ä∞≈†¬Æ#¬∏–≤P=j√ª‚àä√ï√á√´√§√ª–º‚ÄîsJT«ù‚Äî∆í–≤¬º√™Œπ‚Äò√ô‚Ä†¬®Œì√µƒáI√é√•≈°¬¢4√ª6√©‚Ä∫a‚Ñ¢√åV¬Ω∆∂‚â†√É√ël√´√∞Œ≤‚Ä∞¬´Àúp:‚Ñ¢¬∞¬Ω‚Äú¬∞2√Ø$¬£√§Œ∂g≈∏
¬ØŒõ√øƒÜ‚Äû‚Ä¶√ª‚â†Q¬≥¬π√Æ√®√Øu√∏√â‚ÇÅ¬¶√Å√ùl^¬®{√ä}–º√Å√±‚ÇÑ<–ΩŒò√Ø√∑@√£r1√¥√ë√å–Ω√ï¬¥‚Ä¶+√ï√ª√íO}√∂NŒ∑√Ü√ü√£‚Äò√≥√∑√ü0x√•1_|¬£√íŒ∂√úqz√ö¬ºW^√ï√¶√ìt\[≈°IvŒµ¬©l√∏‚Äö√ï‚àäH‚àûO≈í∆µ≈í‚Ä∫√∂;¬ªE¬æ∆∂ƒáƒÄ#8lr√†QÀúa√ß¬Ω>¬¨Œª√ì‚Ñ¢¬æ¬≤√≥p√∂Œ∑¬ºƒÄ-√¶ƒÜ‚ÄûWp6m‚Äù^t√∏gO√µŒõ¬¶‚â†√Ö√∫√ëDŒ≤= íRJŒ∂√£‚ÇÇ4N,]√ÑK√•√≠‚Ä¢‚ÇÜB≈Ωm&",.' 
"‚Ä°‚Ä¢v≈Ω¬≤~¬≥√ñƒÄw`]¬¨√™‚ÇÇR‚àûv¬≥√øk√ò√¶!Xh¬§li¬£4ƒÜdC¬µ A√´p
U√é‚Äò¬±6 íŒπ√©¬µ√û3Y>√ù{#r9‚Ä∫¬Ω, √•<≈°*√•$‚ÄùW¬µ->M√©‚ÇÖ√•ÀÜ√≠√èV"¬£¬≥¬ß`%kI≈Ω¬≤,‚Ä°√®Œ±¬≤‚Äö‚Ä¶ √ôP¬ß¬¢‚àû>r‚Äù‚àç(+ƒÄ~‚àä¬≥Œ≤¬®√îX3√É√∞√ò¬≥≈æÀú√ª—Ç√ái√∫√â,9Œ©√ç√åJ√∂Œµ≈°¬¢‚â†¬´¬º‚ÄúUP¬∫i]¬§z¬•‚Ä¢bT‚ÄûAa‚Ä°.√è
```
[Try it online!](https://tio.run/##HZR5UxNpEMb/51Mg4LFccknBcqggK8LKoaiwgoAlxYKh5BIsNNQkQAiIIgFdkITNQQJIJCEhyUCSoaqfDFSRqqnsV5gvwvb4RyaVN/N2P/3rp/vNWO/Lgb7LS1VwZquzzsmy23D8lYpVjlIMH/Uwv6rDrCyqRm@jEqhQhQ0sIdKjGk1N@Dha0YyNVFzZpG2Ib@qmYcMx5m/rSzFHh22I1CUMRRSAD47hxg/kwxdVsCettR04gBNCw68T45wqWJVo0nq9qlM1zhQkTU2qcFzzkPZSsT6KY4k/VmzAfLu1fVwVbGkTdDSCdZxcgVSchYDsGMbRTVVYw@5AN/x3xpUgheCv0ZPvsWqcLaWjatiayKeEddiBRxUcFKMw7SQMg12dBZDuTzapRkMlnO2Fb85Cz2Hpp2AjVlkDvKrwHTGcsqzCOjrAkhK5sNxQ1jCjRPGxXbboKPQ0k/9Nx2cmYKMjhBFRQt1Xa3OmYMurzeN6iaOsDyFMx1Oq@RMFz20jfMo42y4sqrBVJEtPsFWNZdpTjrWkQXXBjlMO5GXGqTgXxgk6U7GEoRxS6aCyh00lyBc5wp@M5QtJHUPlDPSgFzE6pJBskSV8o6gswoN/uOQDBHHC6o/lOBarweFm7yNyS9nk6sawwVmqINbr4BprwTLWO8lL0TpNuA@zmJftLXfIIdthyMYKg2JG5O@DSJJ21YjPjNRozIfxxq9O2t7W3htlxqy5GdIj/oIp7xpWtH5z4qS1ny9KFYzAUaa/lTvF5dUjwnXrsTWIo2tcWH3jHzAzBIV7nDAVkNjbkPMS9vswT2ELCx0lk3k3scgBlMNubGRdGaBDrfvSSPm5LftxKn5uU8S@mlasNOboVcEPGz80inxhj8KK6x05i4vuaR22T9AP7Y1PV1Pi@C1Zyv6glfMbBVkpOZoQb0/FycPo5jEDicR8EhEoGyWnKpzQTh8/sZTRwgDPQgkD1/iNTgYV1zR8PWmqeQtu2TLJ3veOcZNOVPNiwsDJZDsdZJKYCrRUDSLKp/jK4fexjWgqxjLHGtrOWfHamSUV4AH8oZlinVFzP3aVVYQS8w9YpFt2kLME0VLssYpeHlssPaX4WVgzzwxWdBzRrwQ4H@0nrcO/8wvkJzaTlfxF8GWRC9tKuF8W03gwNnGaMGmOEjysaMHeSkE6ZtvswvcWIha46@SBATbdC9p9j0V9Ksa/DhlSJc/@OpcYuQPXaCGOmMFSKo6vdMSxcriyKCzNeoSblAhM@BcurZYgIvi34B3chd0fWIdFCcM6MoXvFHv2gq94sDre@Vx2PJhQQrSng6gN4VcGVc9Mm2XLGTtcIx@uYJuSdBZOzCeEzDLdKOytSWsvdiheTV4e0FWtaInXT3AYYSVCsYSQB8@vSp8Nlw6xV1@MQ@xvRoj3l0cDN4cTrNxTAlUXlkcNLMvFzi5pyu3CbCPc@MkLkntdI8eHrmXk5l9PT8vQjC44J@Q4BaYpiG8JYbKni7z4wRcfsdwJPjx9zcvKc6X9b9rWDZCrJGF6VUuh9LvYH057gs9MhA5LLyzKMfZ4b20Vd/C6ep85Wq55LJ6bDnel7MiGO4v1PqNQXvVDbrlxDu6kCT@x/DSDXNyunZ6rrx9oMnJZEnaVQ@Lef@cmpGOjhXbYseatap5LG6@gGzkJYZp5UlAJ0C7W2ovZMX6sU1CWklZE/zNifoBJLOSW87L5hKUGxhfSDMeMaJ/YpdYnLXQy0EXbU@RmAC/bmOndXk6dj@XLy/8B "05AB1E ‚Äì Try It Online")
[Answer]
## Java 758 chars
Here is my Java effort ( 758 chars )
```
public class Poem{public static void main(String[] args){String s1="swallowed",st="There was an old lady who "+s1+" a |.",d1="Perhaps she'll die.",d2="She died ofcourse.",e="I don't know why she " + s1 + " that fly,\n";String[] a={ "fly","spider","bird","cat","dog","horse"};String[] q={ "","That wriggled and iggled and jiggled inside her.","How absurd |","Imagine that |","What a hog |",null};for(int i=0;i < a.length;i++){print(st.replace("|",a[i]));if(q[i]==null){print(d2);break;}if(!q[i].isEmpty()){               print((q[i].replace("|","to swallow a " + a[i])).trim());for(int j=i;j > 0;j--){print("She swallowed the " + a[j] + " to catch the " + a[j - 1] + ",");}}print(e + d1 + "\n");}}
static void print(String value){System.out.println(value);}}
```
[Answer]
# Java, 655 bytes
```
public class M{public static void main(String[]P){String S="swallowed",T="There was an old lady who "+S+" a |.",e="I don't know why she "+S+" that fly,\n";String[]a={"fly","spider","bird","cat","dog","horse"};String[]q={"","That wriggled and iggled and jiggled inside her.","How absurd |","Imagine that |","What a hog |",null};for(int i=0;i<a.length;i++){p(T.replace("|",a[i]));if(q[i]==null){p("She died of course.");break;}if(!q[i].isEmpty()){p((q[i].replace("|","to swallow a "+a[i])).trim());for(int j=i;j>0;j--){p("She swallowed the "+a[j]+" to catch the "+a[j-1]+",");}}p(e+"Perhaps she'll die.\n");}}static void p(String v){System.out.println(v);}}
```
This is a **golfed** version of [this answer](https://codegolf.stackexchange.com/a/3712/55550). There's over 100 bytes saved on minor things.
[Answer]
# [Charcoal](https://github.com/somebody1234/Charcoal), 369 366 bytes
```
Ôº°‚Äù‚Üì0*)Ôº¢‚éöD¬≥9;7Ôº±7‚à®-f¬∂_¬≤œá‚Å∂Ôºõ‚Üßl‚Å∫I¬¥‚Äù¬¶Œ±Ôº°‚ÄúV√óq‚ñ∂¬≤‚ñ∑O‚âï‚¶É0j‚Üñ‚ñ∑(œÑ‚éá‚¶Ñ4œâ\`j0Ôº¥‚ÅπœàÔº©2b1z√ºœÅ√Ä‚Üë‚Äπ‚Åª√™¬£Ôº°Ôº∫‚ÄπÔºüÔº§OR¬ß1œÜ‚Äù¬¶Œ≤Ôº°‚ü¶spider¬¶bird¬¶cat¬¶dog‚üß¬¶ŒªÔº°,¬∂¬¶ŒΩÔº°‚ü¶‚Äù‚Ü∂7‚éáÔº©Ôº∞Ôº∂pŒ∏Œ∏‚™™‚ûôÔº≥¬≤p‚∏øH‚Å∏‚úÇŒΩ‚Äñ2‚Üñ¬≤œÜ‚ÜònœÑME‚¶ÑÔº¢‚ÜìŒælÔº¶‚Åµy‚Äù¬¶‚Äù‚Ü∂7Nl@;‚™´Œª38ÔºÆ‚àï¬¥‚âï‚Å∫)¬≥ n√Ä‚Ä¥‚¶É‚Äù¬¶‚Äù‚Ü∂7‚Üê¬¥<7ÔºπKÔº¢YœánÔº∫-‚ÜñÔºµ‚éáŒπ\HUŒ∏%Ôºõ‚üß‚Äù¬¶‚Äù‚Ü∂7‚àß¬ß‚Ä¥‚üßO√óœÜ¬¢\`*NQ¬∂G‚Å∫$œÄ‚ÄΩŒæat‚Äù‚üßŒºÔº°‚Äù‚Üì/!Ôº∫m‚™´‚üßŒ±√Ä‚ÅªÔº∂Œµ>‚ü≤‚Äù¬¶œÉÔº°‚ÄùÔΩú‚ÄΩaÔº£-‚Å¥t;Z‚åï‚Äù¬¶œÑÔº°‚ÄúY‚à®‚Ü∑ur1Ôº¢ÔºØ#√øk¬ª‚ÅªœÖv‚ÄΩ‚åä‚Üêzœâ‚Üò^‚Äù¬¶Œ∑‚Å∫Œ±Œ≤Ôº¶‚Å¥¬´‚Å∫‚Å∫‚Å∫Œ±¬ßŒªŒπŒΩ¬ßŒºŒπÔº¶‚Æå‚Ä¶‚Å∞Œπ¬´‚Å∫‚Å∫‚Å∫‚Å∫œÉ¬ßŒª‚Å∫Œ∫¬πœÑ¬ßŒªŒ∫ŒΩ¬ª‚Å∫‚Å∫‚Å∫œÉ¬ßŒª‚Å∞œÑŒ≤¬ª‚Å∫Œ±Œ∑
```
[Try it online!](https://tio.run/##bVG9bsIwEN55ilMWHMkgKnXrxFY2RJE6lA5HbGIXYyPbkKKKZ0/PSQFTMSSx7r5fp1LoK4embach6NqyYqmkl9BgALTgjACD4gSNchAaNMY1UgBCwQHLl8GFtDGn8crOQDg7jLC1riHGCYKSGSsqjEBIvrJz6RXuQwIMjQGhJdFXllTXN9WPIuy1kL7gxVp7QZ8KI72Fq4tPDibz5x3X5txlcmu8rmuTElsB2fHr76xtIAegyuOkULxScFyHg6e018JUN/n3iNkOa21lX@YOQ@F6yHtaIShX3wModwJQ9F0W/e3fHcl0tyEDJBHSrtRlGbOlcj5Iap9U6BYFuA1U7kDDMSEVIQdzr21kUyEY8nVJk43z7LmEnwHAbXd5kE/jzAr5zQzXZclteR3s0oD4AKQAbCGPknzYAm0t2aRbdqKPZNMTONy002DLn4jDY5l5bmlAP7KzOT9MGDL0pKd3tc53TRWN2rYdHdtRML8 "Charcoal ‚Äì Try It Online")
Link to the verbose version of the code.
]