Instead of ->execute($var[0], $var[1], ...), why not just use ->execute(@var); or ->execute(@var[0..6]);?
Unless I am missing something elsewhere, I don't see what DIE is. Did you perhaps mean die?
Look into the use of my and scoping your variables in as small of a scope as needed. $mp3 as an example should be declared at the point where the new() call is made (eg: my $mp3=MP3::Tag->new(..)).
While the if (/\.mp3$/i) { is ok, you can avoid a level of nesting by changing the enclosing if block to return unless /\.mp3$/i;. My statement becomes invalid if you wish to do something else if it does not end in mp3.
The section where you declare @songinfo, $mp3, and @dirs is wonky. They are mixed types, and I don't think that it does what you think it does (but I could be wrong ;-)