Now I understand, because my subroutine does NOT return a number. It makes mathematical operations on files and prints results but there is NOT a return so it is normal "die" is executed !
That is not true, according to the documentation for return, and as others in this thread have already pointed out:
(Note that in the absence of an explicit "return", a subroutine, eval, or do FILE will automatically return the value of
the last expression evaluated.)
This is why moritz correctly pointed out that your sub is indeed returning a value, and it even might be numeric (0).
Consider the following contrived example:
#!/usr/bin/env perl
use warnings;
use strict;
my $result;
$result = foo();
print "result=$result\n";
$result = bar();
print "result=$result\n";
sub foo {print "foo: "}
sub bar {print "bar: "; chdir '/nodir'}