У вас почти это есть, но вы, вероятно, хотите this.value
.
print $cgi->popup_menu(
- name => 'url',
- id => 'url',
- values => [sort keys %url],
- default => ['google'],
- labels => \%url,
- onchange => q{window.open(this.value, '_blank', 'toolbar=0,location=0,menubar=0');},
);
Но, как я уже прокомментировал, поскольку эти методы CGI устарели, пожалуйста, рассмотрите возможность использования альтернативного as Template :: Toolkit . Обычным шаблоном в TT является наличие двух файлов, которые могут выглядеть следующим образом.
Файл Perl:
#!/usr/bin/perl -Tw
# my_form.cgi
use strict;
use warnings;
use utf8;
use HTTP::Headers;
use Template;
my $headers = HTTP::Headers->new;
$headers->header('Content-Type' => 'text/html;charset=UTF-8');
print $headers->as_string;
my %urls = (
"https://www.google.com" => "google" ,
"https://www.msn.com" => "msn",
"https://www.yahoo.com" => "yahoo"
);
my $template = Template->new;
$template->process('my_form.ttml', { urls => \%urls });
Файл шаблона:
[%# my_form.ttml %]
<!DOCTYPE html><html>
<head>
</head>
<body>
<form>
<select name="url" id="url" onchange="window.open(this.value, '_blank', 'toolbar=0,location=0,menubar=0');">
[% FOREACH url IN urls -%]
<option value="[% url.key %]">[% url.value %]</option>
[% END -%]
</select>
</form>
</body>
</html>
Вы можете посмотреть Template :: Manual и Template :: Manual :: Intro для получения подробной информации о Template :: Toolkit, или вы можете посмотреть CGI :: Alternatives для большего вдохновения.