Since this is Perl and there is always more than one way.... you can use 2 regexes and then you don't need sprintf. I don't know which actually executes faster.
Code follows showing these cases..
a. could use one regex to handle 2 digit day, another for 1 digit day
b. probably better is to handle single digit day, then swap order instead of combining the replace and swap
c. doesn't handle single digit month, so could use a 3rd regex to fix that
d. finally, could fix any single digit and then swap order
use strict;
use warnings;
my $x='11-3-1936';
$x=~ s/(\d+)-(\d\d)-(\d+)/$3-$1-$2/; #2 digit day
$x=~ s/(\d+)-(\d)-(\d+)/$3-$1-0$2/; #1 digit day
print "$x\n"; # 1936-11-03
$x='2-5-1966';
$x=~ s/(\d+)-(\d)-(\d+)/$1-0$2-$3/; # fix 1 digit day
$x=~ s/(\d+)-(\d+)-(\d+)/$3-$1-$2/; # swap order
print "$x\n"; # 1966-2-05 doesn't fix single digit month
$x='2-5-1966';
$x=~ s/(\d+)-(\d)-(\d+)/$1-0$2-$3/; # fix 1 digit day
$x=~ s/(\d)-(\d+)-(\d+)/0$1-$2-$3/; # fix 1 digit month
$x=~ s/(\d+)-(\d+)-(\d+)/$3-$1-$2/; # swap order
print "$x\n"; # 1966-02-05 ok, but uses 3 regexes
$x='2-5-1966';
$x=~ s/\b(\d)\b/0$1/g; # fix any single digit
$x=~ s/(\d+)-(\d+)-(\d+)/$3-$1-$2/; # swap order
print "$x\n" # 1966-02-05