in reply to
invoking subroutines
the line $str->$str1($regexp); always passes $str as parameter to the subroutine.
$str is passed as first argument to the subroutine because you are using method invocation syntax. In particular, you are using the arrow operator: ->.
If you don't want $str passed as the first argument, you could use a symbolic reference:&{"${str}::${str1}"}($regexp).
use strict;
use warnings;
package XXX;
sub YYY {
my ($x) = @_;
print "hi there $x\n";
}
package main;
my $str = 'XXX';
my $str1 = 'YYY';
{
no strict "refs";
&{"${str}::${str1}"}(10);
}