So, you solution would eventually run out of memory; or would hit the limit of number of processes your os will allow. If you really want it to be infinite; you should use exec; which would basically be doing a tail call optimization. (Since nothing after the exec will get called; and the process memory space is reused.)
#!/usr/bin/perl
use v5.12.0;
use warnings;
say 'foo:'.($ARGV[0] // 'none');
exec join(' ' ,$^X, $0 , $ARGV[0]+1) ;
]]>