The problem is that the Text widget has default bindings to a Popup menu when you right click. You can either make a custom derived Text widget to remove the Popup menu, and replace it with your code, or you can let the Popup do the work.
See
Making a derived Tk::Text object for how to make a custom derived Tk::Text widget.
To let the Popup do the work, try something like this:
#!/usr/bin/perl
use Tk;
my $mw = MainWindow->new;
my $txt = $mw->Text()->pack(-side => 'top');
my $number = 1;
my $letter = 'a';
my $popup_menu = "";
my $new_menu = $mw->Menu();
$new_menu->add('command',
-label => "Click me to show the pop-up menu.",
-command => sub {
$popup_menu = $mw->Menu();
$popup_menu->add('command',
-label => "Number: $number",
-command => sub {
print STDERR "Number: $number\n";
$number++;
}
);
$popup_menu->add('command',
-label => "Letter: $letter",
-command => sub {
print STDERR "Letter: $letter\n";
$letter++;
}
);
$popup_menu->Popup(qw/-popover cursor/);
}
);
$txt->menu( $new_menu );
MainLoop;