$result = function(@args) would be usual syntax. You almost never need &. The main effects of & are that it passes @_ to the called function and you don't need () after the function name to pass strict. However do note that &::function and ::function are calling main::function(). This matters if you are in another package:
#package main; # this is implicit
bar( qw( some args that were passed along ) );
foo( 'foo() stuff' );
::foo( '::foo() stuff' );
&::foo( '&::foo() stuff' );
sub bar { &foo; }
sub foo { print __PACKAGE__, " foo got '@_'\n" }
foo; # bareword will work with no strictures after sub defn
package Foo;
foo( 'foo() stuff' );
::foo( '::foo() stuff' );
&::foo( '&::foo() stuff' );
sub foo { print __PACKAGE__, " foo got '@_'\n" }
__DATA__
main foo got 'some args that were passed along'
main foo got 'foo() stuff'
main foo got '::foo() stuff'
main foo got '&::foo() stuff'
main foo got ''
Foo foo got 'foo() stuff'
main foo got '::foo() stuff'
main foo got '&::foo() stuff'