See system for why your code returns 0.
The which program does not exist on Windows, so your idea won't work anyway. But the easiest way to get the output of a subprocess is to call it using backticks `...` or qx(). See perlop on both.
If you want to find programs on the path, you will need to use File::Spec to split up the path into its parts and then check whether a file (possibly amended by [doc://Config]::Config::_exe) exists in that location, and is executable. See, again, perlop about the -X operators.