1

我有一个 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;
}
#------------------------------------

期望的输出

foo foo foo bam bam

任何帮助或建议表示赞赏。

4

3 回答 3

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 风格的引用,因此您可以同时使用双引号和变量插值,而无需转义字符。

于 2013-05-07T05:31:49.100 回答
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
于 2013-05-08T02:40:49.457 回答
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";
于 2013-05-07T05:45:01.120 回答