请注意,您的return说法是有问题的:这两个数组都将展开到一个和调用代码将无法返回值分配给两个独立的数组。如果你想保持这个接口的精神,你应该返回对这些数组的引用。见perldoc perlsub:
甲return语句可用于退出子程序,根据子程序调用的上下文中选择指定所返回的值,这将在适当的上下文进行评估(表,标量,或空隙) 。 ......如果你返回一个或多个聚集(数组和哈希),这些将一起展开到一个大的区分清单。
使用split因为电脑我上既没有Text::CSV也不Text::xSV]打字。现在
#!/usr/bin/perl
use strict; use warnings;
my (@header) = map { chomp; split /,/} scalar ;
while (my $line = ) {
last unless $line =~ /\S/;
chomp $line;
my (@values) = split /,/, $line;
print "\n";
for (my $i = 1; $i < @header; $i += 1) {
printf qq{%s = %s\n},
$header[$i], $values[$i], $header[$i], $values[$i];
}
print "\n";
}
__DATA__
Time,h1,h2,h3
00:00:00,n1,n2,n3
,如果我是这样做的事情,我会分开,我读出的数据的部分和我产生并使用后者的模板为基础的方法。这里有一个例子:
#!/usr/bin/perl
use strict; use warnings;
use HTML::Template;
use List::AllUtils qw(each_arrayref);
my $select_html = <
value=""> =
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;
}
输出:
value="a1">h1 = a1
value="a2">h2 = a2
value="a3">h3 = a3
value="b1">h1 = b1
value="b2">h2 = b2
value="b3">h3 = b3