Perl CGI功能编程 - 生成链接

时间:2013-05-07 04:48:30

标签: html perl hyperlink functional-programming cgi

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

感谢任何帮助或建议。

3 个答案:

答案 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