微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 perl 中重新加载页面时如何显示文本文件中的随机数据?

如何解决在 perl 中重新加载页面时如何显示文本文件中的随机数据?

我有一个名为“poduct_data.txt”的文本数据文件

id  |  name  | top
------------------
id01--  name01--    top

id02--  name02--    
id03--  name03--    
id04--  name04--    top

id05--  name05--    top

id06--  name06--    
id07--  name07--    top

id08--  name08--    
id09--  name09--    
id10--  name10--    top

这里有 3 列,名为 id、name&top。 “我的任务是:

  1. 从该文本文件中查找顶部列数据
  2. 在重新加载页面时按三个顶部数据随机显示它们。" 如:name01 name04 name05

如果重新加载页面然后随机显示另外3个数据 可能是:name07 name05 name10

每次重新加载页面显示与顶部数据不同的3个数据

1 完成并显示如下:name01 name10 name04 name07 name 05

但在 2 中有问题。

我的工作文件在下面:

文件:ProductLib.pm

    package ProductLib;
    use strict;
    use File::Basename;
    use FileHandle;
    use Encode;
    use CGI;
    use POSIX;
    use Date::Parse;
    
    sub new {
        my $class   = shift;
        my ($ProgramName,$ProgramPath,undef)  = fileparse($0);
        my $self    = {
                    'program_name'      => $ProgramName,'program_path'      => $ProgramPath,'data_dir'          => 'data','product_data_file' => 'product_data.txt','template_dir'      => 'templates','template'          => {},'cgi'               => new CGI(),@_,};
    
        $Data::Dumper::Sortkeys = 1;
        $Data::Dumper::Indent = 1;
        $Data::Dumper::Terse = 1;
    
        return bless $self,$class;
    }
    sub SearchRandomProduct{
        my $self        = shift;
        my $TargetTop       = shift;
        my $ProductHash = $self->GetProductData();
    
        my $TargetProduct   = {};
        foreach my $ProductId (sort {$a cmp $b} (keys %{$ProductHash})){
    
            my $ProductData     = $ProductHash->{$ProductId};
            my $ProductTop      = $ProductData->{'top'};
    
            next if(defined $TargetTop && $ProductTop ne $TargetTop);
    
            $TargetProduct->{$ProductId}    = $ProductData;
        }
        return $TargetProduct;
    }
    sub GetProductData{
        my $self        = shift;
        my $FilePath    = sprintf('%s/%s',$self->{'data_dir'},$self->{'product_data_file'}
                            );
        my $FileData    = ${$self->GetFileData($FilePath)};
    
        my $ProductHash = {};
        my @LineData    = split("\n",$FileData);
    
        foreach my $LineData (@LineData){
            next if($LineData eq '' || $LineData =~ /^#/);
    
            my @DataArray       = split("\t",$LineData,3);
            my $ProductId       = $DataArray[0];
            my $ProductName     = $DataArray[1];
            my $ProductTop      = $DataArray[2];
    
            $ProductHash->{$ProductId}  = {
                    'id'        => $ProductId,'name'      => $ProductName,'top'       => $ProductTop,};
        }
        return $ProductHash;
    }
    sub SetTemplateParameter{
        my $self    = shift;
        my $TemplateData    = shift; 
        my $ProductData     = shift;
        $TemplateData   = ${$TemplateData} if(ref($TemplateData) eq 'SCALAR');
        $TemplateData =~ s/\$\{(.*?)\}/$ProductData->{$1}/ges;
        return \$TemplateData;
    }
sub GetFileData{

    my $self        = shift;

    my $FilePath    = shift;

    my $FileData    = '';
    if(-e "${FilePath}"){

        my $FileHandle  = new FileHandle;
        sysopen($FileHandle,"${FilePath}",O_RDONLY);
            $FileData = join'',<$FileHandle>;
        close($FileHandle);
    }
    return \$FileData;
}
    1;

cgi 文件:product_random_list.cgi

#!/usr/bin/perl

use FindBin;
use lib "$FindBin::Bin/lib";
use strict;
use CGI;
use ProductLib;
use Data::Dumper;

 my $ProductFormat  = ' <a class="card">
                            <div class="card-body">
                                    <strong>${name}</strong>
                            </div>
                        </a>';
my $q           = new CGI;
my $ProductLib  = new ProductLib();

my $TargetMode      = $q->param('mode') || 'init';
my $TargetTop       = $q->param('top');

my $ProductList = {};

if($TargetMode eq 'init'){
    $ProductList    = $ProductLib->SearchRandomProduct($TargetTop);
}

my $ProductHtml = '';
foreach my $ProductId ( 
    sort {
        $ProductList->{$a}->{'id'} cmp $ProductList->{$b}->{'id'}
    }
(keys %{$ProductList})){
    my $ProductData = $ProductList->{$ProductId};
    $ProductHtml    .= ${$ProductLib->SetTemplateParameter(\$ProductFormat,$ProductData)};
}

print "Content-Type: text/plain; charset=utf8\n\n";
print $ProductHtml;
exit;

索引文件:index.html

<!DOCTYPE html>
<html>
<body>

<section>
    <div class="container-fluid">
        <div class="card-deck sMb">
                <!--#include virtual="/ssi/product_random_list.cgi?top=top" -->
        </div>
    </div>
</section>

</body>
</html>

请帮我在上面的索引页重新加载页面时按三个顶部数据随机显示它们...

解决方法

重新加载页面时按前三个数据随机显示。

您可以使用例如 List::Util::shuffle() 从产品列表中随机选择三个项目。示例:

use strict;
use warnings;
use List::Util qw(shuffle);
my $ProductList = {
    id01 => {id => 'id01',name => 'name01',top => 'top'},id10 => {id => 'id10',name => 'name10',id04 => {id => 'id04',name => 'name04',id07 => {id => 'id07',name => 'name07',id05 => {id => 'id05',name => 'name05',};
my @ids = keys %$ProductList;
my @idx = shuffle 0..$#ids;
my @randidx = @ids[@idx[0..2]];

每次重新加载页面显示与顶部数据不同的3个数据

为了识别页面是否重新加载,您可以使用会话变量。有关详细信息,请参阅 CGI::Session

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。