You're probably experiencing
greed. This means the .* in the middle of your match will grab everything between the first <script> and last </script> in $foo, including other </script>...<script> combinations.
The following code should give you some ideas. It does assume that there are no other HTML tags between the <script> and </script> tags.
$s = qq(<script>chunk1</script> stuff <Script>chunk2</Script>);
while ( $s =~ m|<script>([^<]+)<\/script>|gi ) {
print "match: $1\n";
}
Also, I don't know if this was intentional or not, but you're also doing a substitution by starting your expression with an s. That will replace anything you match in $foo with nothing (effectively removing it from the scalar).
I hope this is what you were looking for.