トップレベルで定義された my と our

コメントに書いたような挙動となる。
myはパッケージが違うと参照できない。
ourはどこからでも参照できる。(但しパッケージを指定すること)

ちなみに、トップレベルのパッケージ名は"main"か、あるいは空文字。
よって、パッケージからトップレベルのグローバル変数"var"を参照する場合は $main::var とか $::var。

test.pl
#!/usr/bin/perl
use strict;
use warnings;

our $our_hoge = "hoge";
my $my_hoge = "hoge";

sub print_our_hoge() { warn $our_hoge; }
sub print_my_hoge() { warn $my_hoge; }

&print_our_hoge();
&print_my_hoge();

use test;

test::print_our_hoge(); # <- もちろん正常に動作。
test::print_my_hoge();  # <- もちろん正常に動作。
test.pm
package test;
use strict;
use warnings;

sub print_our_hoge() { warn $::our_hoge; } # <- 正常に動作。
sub print_my_hoge() { warn $::my_hoge; }   # <- エラー。

1;

あと、あまりやらないだろうが .pl を require で呼び出すときはこんな感じ。
myはファイルが違っても呼び出せない。
なお、ourはファイルが違う場合もパッケージ名付けないと呼び出せない。

test2.pl
#!/usr/bin/perl

our $our_hoge = "hoge";
my  $my_hoge = "hoge";

require 'test_sub.pl';
test_sub.pl
#!/usr/bin/perl
use strict;
use warnings;

warn $::our_hoge; # <- 正常に動作。
warn $::my_hoge;  # <- エラー。

1;