Perl 固定散列中的散列位置

Perl 固定散列中的散列位置,perl,Perl,我有以下代码将数据传递到csv,但是csv中的列顺序似乎是随机的(我将哈希传递到csv)。我很难定义列的顺序 有没有办法修复%output\u var散列中散列的位置,以便有效地定义CSV中的列顺序 $common->print_header('text/csv','export_order_products.csv'); print common::to_csv(sort values %output_var)."\r\n"; my $cart_id; foreach my $order

我有以下代码将数据传递到csv,但是csv中的列顺序似乎是随机的(我将哈希传递到csv)。我很难定义列的顺序

有没有办法修复%output\u var散列中散列的位置,以便有效地定义CSV中的列顺序

$common->print_header('text/csv','export_order_products.csv');
print common::to_csv(sort values %output_var)."\r\n";
my $cart_id;
foreach my $order (@data_to_export) {
  $order->{'order-id'} =~ s/\.cgi//;
  $order->{'order-item-id'} =~ s/\.cgi//;
  $order->{'purchase-date'} =~ s/\.cgi//;
  my @line;
  for (sort {$output_var{$a} cmp $output_var{$b}; } keys %output_var) {
    push @line, $order->{$_};
  }
   print common::to_csv(@line)."\r\n";
                }
CSV分包:

sub to_csv {
    my ($csv_line);
    my (@fields) = @_;
    my $i;
    for ($i=0; $i<scalar(@fields); $i++) {
        $fields[$i] =~ s/\r/\\r/gis;
        $fields[$i] =~ s/\n/\\n/gis;
        $fields[$i] =~ s/"/""/gis; # -- "
        $fields[$i] =~ s/(.*,.*)/"$1"/gis;
        $fields[$i] = '' if ($fields[$i] eq '0');
    }
    $csv_line = join ',', @fields;
    return $csv_line;
}
sub to_csv{
我的($csv_线);
我的(@字段)=@;
我的$i;

对于($i=0;$i如果您使用的是Text::CSV或Text::CSV_XS

# Outside the loop
$csv->column_names([qw( ... )]);

# Inside the loop
$csv->print_hr($fh, $order);
但是您似乎没有使用这些模块中的任何一个(?!?!),所以


这真的很酷。要了解更多关于如何/为什么这样做,谷歌“perl hash slice”。注意语法
@$order{@headers}
。你可能认为你也可以这样做,但你不能。
$order->{@headers}
@Mort,但是,你可以从5.24开始做(或者从5.20开始,如果你使用
使用功能qw(postderef);
无警告qw(实验性::postderef);
);
# Outside the loop
my @headers = qw( ... );

# Inside the loop
print($fh to_csv(@$order{@headers}), "\r\n");