我有一个Perl CGI脚本。我正在尝试使用数组中的所有元素在HTML页面上生成超链接。我正在使用功能性的CGI风格编程。这是我的代码的最小代表:
#!/usr/bin/perl
use strict; use warnings;
use CGI qw( :standard);
print header;
print start_html(
-title => 'Get LINK!'
);
my %HoA = (
'foo' => [ '12', '23', '593' ],
'bam' => [ '232', '65' ],
);
my @array = ("foo", "bam");
foreach my $i (@array){
foreach my $j (@{$HoA{$i}}){
my $link = get_link($i);
print "<a href="$link" target="_blank">$i</a>"."\t"; # this doesn't work!!
}
}
#-----------------------------------
# this subroutine works!
sub get_link{
my $id = $_[0];
my $link = 'http://www.example.com/'.$id;
return $link;
}
#------------------------------------
感谢任何帮助或建议。
答案 0 :(得分:2)
print "<a href="$link" target="_blank">$g</a>"."\t"; # this doesn't work!!
那是因为你的报价中的报价结束了你的报价。你需要逃脱它们:
print "<a href=\"$link\" target=\"_blank\">$g</a>"."\t"; # this doesn't work!!
单引号也在内部工作。
根据评论,您也可以使用qq样式引用,因此您可以在没有转义字符的情况下同时使用双引号和变量插值。
答案 1 :(得分:1)
有一些事情没有多大意义。
以下代码不起作用,因为$link
是参考号。此外,您没有在任何地方使用$j
,
这应该会给你一个迹象,表明存在一些“设计”问题。
foreach my $i (@array){
foreach my $j (@{$HoA{$i}}){
my $link = get_link($i);
print "<a href="$link" target="_blank">$g</a>"."\t"; # this doesn't work!!
}
}
为什么不能这样改写:
for my $array_ref (keys %HoA) {
for my $item ( @{ $HoA{$array_ref} } ){
my $link = get_link($item);
# print ....
}
}
这个子“如何工作”? $id
是这里的数组引用。你的意思是shift
到$ id吗?
#-----------------------------------
# this subroutine works!
sub get_link{
#my $id = $HoA{$_[0]};
# with the refactored double for loop, or the way you had it if you fix the
# `ref` issue, a `shift` should do the trick.
my $id = shift;
my $link = 'http://www.google.com/'.$id;
return $link;
}
#------------------------------------
您还需要在print
语句中转义引号:
print "<a href="$link" target="_blank">$g</a>"."\t";
答案 2 :(得分:1)
这是另一种方法,你可以做到这一点......
use strict;
use warnings;
use CGI qw(:standard);
print header,
start_html(-title => 'Get LINK!');
my %HoA = (
foo => [ qw(12 23 593) ],
bam => [ qw(232 65) ],
);
foreach my $i ( reverse sort keys %HoA ) {
foreach ( @{$HoA{$i}} ) {
print a({-href => 'http:/www.google.com/'.$_,
-target => '_blank'}, $i) . "\n";
}
}
输出:
foo foo foo bam bam