And get the desired results. The funny thing is, I was expecting that $data would be empty after the call or something, but was surprised to see that the value looked unchanged. I then changed the second extract_multiple to:

After seeing this, I reviewed the docs for Text::Balanced, and noticed this:

Note that in a list context, the contents of the original input text (the first argument) are not modified in any way.
However, if the input text was passed in a variable, that variable's pos value is updated to point at the first character after the extracted text. That means that in a list context the various subroutines can be used much like regular expressions. For example:

In short, it's supposed to do that. That way it's ready to pull out the *next* bits of balanced text for you. Appending a null to the end of the string simply resets the string.

Sigh! Had I read the docs before playing with the code, I'd've saved myself a little time. Ah, well...