when rsync is run from a bash script, shell metacharacters (i.e. wildcards) are expanded by bash in the UNIX fashion. On the other hand when you invoke rsync directly from Perl, it is called via cmd.exe that does the old MS-DOS expansion.
You can probably use some program like ProcessMonitor to see the different set of arguments that rsync gets in every case.
Comment on Re: Running a cygwin command from within activestate