我正在创建一个网页,从CSV文件中选择一些选项:
CSV文件示例:
Time,h1,h2,h3,....
00:00:00,n1,n2,n3.....
.....so on
h -> header
n -> numbers
下面是我编写的Perl代码子例程,用于过滤标题和值并返回:
sub TimeData
{
use Text::CSV;
my @time;
my @data;
my ($csv_file, $type) = @_;
open(my $csv_fh, '<', $csv_file) or die $!;
my $parser = Text::CSV->new();
$parser->column_names( $parser->getline($csv_fh) );
while ( defined( my $hr = $parser->getline_hr($csv_fh) ) )
{
push @time, $hr->{Time};
push @data, $hr->{$type};
}
return (@time, @data);
}
我想创建一个页面,其中输入字段有一个下拉菜单,其中包含h1,h2,h3等列表。所选的标题值可以用作另一个Perl脚本的输入。任何人都可以建议一些代码来完成这项工作。
答案 0 :(得分:3)
请注意,您的return
语句存在问题:两个数组将被展平为一个,调用代码将无法将返回值分配给两个单独的数组。如果你想保持该接口的精神,你应该返回对这些数组的引用。见perldoc perlsub
:
可以使用
return
语句退出子例程,可选地指定返回值,该值将根据子例程调用的上下文在适当的上下文(列表,标量或void)中进行计算。 ...如果您返回一个或多个聚合(数组和散列),这些聚合将被拼合成一个无法区分的大型列表。
使用split
,因为我输入的计算机既没有Text::CSV
也没有Text::xSV
]。
#!/usr/bin/perl
use strict; use warnings;
my (@header) = map { chomp; split /,/} scalar <DATA>;
while ( my $line = <DATA> ) {
last unless $line =~ /\S/;
chomp $line;
my (@values) = split /,/, $line;
print "<select>\n";
for (my $i = 1; $i < @header; $i += 1) {
printf qq{<option name="%s" value="%s">%s = %s</option>\n},
$header[$i], $values[$i], $header[$i], $values[$i];
}
print "</select>\n";
}
__DATA__
Time,h1,h2,h3
00:00:00,n1,n2,n3
现在,如果我正在做这样的事情,我会将我读取数据的部分和我生成<SELECT></SELECT>
的部分分开,并为后者使用基于模板的方法。这是一个例子:
#!/usr/bin/perl
use strict; use warnings;
use HTML::Template;
use List::AllUtils qw( each_arrayref );
my $select_html = <<EO_HTML;
<select>
<TMPL_LOOP OPTIONS>
<option name="<TMPL_VAR HEADER>"
value="<TMPL_VAR VALUE>"><TMPL_VAR HEADER> = <TMPL_VAR VALUE></option>
</TMPL_LOOP>
</select>
EO_HTML
my @headers = qw(h1 h2 h3);
# Stand-in for rows you read from the CSV file
my @values = ( [qw(a1 a2 a3)], [qw(b1 b2 b3)] );
print make_select(\$select_html, \@headers, $_)->output for @values;
sub make_select {
my ($html, $headers, $values) = @_;
my $tmpl = HTML::Template->new(scalarref => $html);
my @options;
my $it = each_arrayref($headers, $values);
while ( my ($h, $v) = $it->() ) {
push @options, { HEADER => $h, VALUE => $v };
}
$tmpl->param(OPTIONS => \@options);
return $tmpl;
}
输出:
<select>
<option name="h1"
value="a1">h1 = a1</option>
<option name="h2"
value="a2">h2 = a2</option>
<option name="h3"
value="a3">h3 = a3</option>
</select>
<select>
<option name="h1"
value="b1">h1 = b1</option>
<option name="h2"
value="b2">h2 = b2</option>
<option name="h3"
value="b3">h3 = b3</option>
</select>