Вы объединяете несколько различных способов работы с модулями и объектами - и в итоге получаете один, который не работает.
Вот четыре подхода, которые работают:
1 / My :: Module - это библиотека. отделка не экспортируется.
$ cat My/Module.pm
package My::Module;
use strict;
use warnings;
sub trim {
my $str = shift;
$str =~ s{ \A \s+ }{}xms; # remove space from front of string
$str =~ s{ \s+ \z }{}xms; # remove space from end of string
return $str;
}
1;
$ cat test
#!/usr/bin/perl
use strict;
use warnings;
use My::Module;
# Note: No $ and :: not ->
print My::Module::trim( " \t hello world\t \t" );
2 / My :: Module - это библиотека. отделка экспортируется.
$ cat My/Module.pm
package My::Module;
use strict;
use warnings;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(trim);
sub trim {
my $str = shift;
$str =~ s{ \A \s+ }{}xms; # remove space from front of string
$str =~ s{ \s+ \z }{}xms; # remove space from end of string
return $str;
}
1;
$ cat test
#!/usr/bin/perl
use strict;
use warnings;
use My::Module;
print trim( " \t hello world\t \t" );
3 / MyModule - это класс. отделка - это метод класса.
$ cat My/Module.pm
package My::Module;
use strict;
use warnings;
sub trim {
# Note class name passed as first argument
my $class = shift;
my $str = shift;
$str =~ s{ \A \s+ }{}xms; # remove space from front of string
$str =~ s{ \s+ \z }{}xms; # remove space from end of string
return $str;
}
1;
$ cat test
#!/usr/bin/perl
use strict;
use warnings;
use My::Module;
# Note: Not $ and -> not ::
print My::Module->trim( " \t hello world\t \t" );
4 / MyModule - это класс, а trim - метод объекта.
$ cat My/Module.pm
package My::Module;
use strict;
use warnings;
# Need a constructor (but this one does nothing useful)
sub new {
my $class = shift;
return bless {}, $class;
}
sub trim {
# Note: Object method is passed an object (which is ignored here)
my $self = shift;
my $str = shift;
$str =~ s{ \A \s+ }{}xms; # remove space from front of string
$str =~ s{ \s+ \z }{}xms; # remove space from end of string
return $str;
}
1;
$ cat test
#!/usr/bin/perl
use strict;
use warnings;
use My::Module;
my $trimmer = My::Module->new;
print $trimmer->trim( " \t hello world\t \t" );
Я думаю, что вы пытались выбрать вариант 1. В этом случае, я думаю, я бы рекомендовал вариант 2.
И чтобы ответить на ваш последний вопрос. Вы получаете эту ошибку, потому что вы пытаетесь вызвать метод для переменной ($ My :: Module), которая не определена.