As far as I understand, all options are optional by default. You can check if they are provided by simply looking if $source_file etc. is undef, and if yes, you can supply your own default value - or die if they are mandatory.
Not just IYHO...Tk::Getopt uses the Getopt::Long API and makes it easy to knock up a simple GUI with loading/saving of options and setting defaults too... You can also override the gui part if you want to take options directly from the commandline
You should probably change 'f' to 'x' in your usage and in your call to getopts. It looks like you have a bug.
You should probably get rid of the @ARGV check because I doubt it does what you think it does. If you pass these 2 options on your command line, '-c foo -x bar', scalar @ARGV will resolve to 4, not 2, as you might expect. Instead, consider checking the return status of the
I make it a habit to check if an option is defined, just in case '0' is a legal value: