not system("zip -rq $target $project_root") or die "couldn't exec zip: $!";
reduces to die "couldn't exec zip: $!" if system ("zip -rq $target $project_root");
Might as well reduce the two keywords "not" and "or" to just one "if".
Comment on Re: Handling weird return values with or die