为什么哈希(来自csv)的大小只读取行数的一半?

nei*_*ilH 0 linux perl hash

我编写了一个简单的perl脚本来计算散列中的值和/或键的数量,这是根据csv的内容创建的.csv看起来像这样:

311552047969,THE UPSETTERS   RETURN OF THE SUPER APE VINYL LP 1978 ,http://www.ebay.co.uk/itm/UPSETTERS-RETURN-SUPER-APE-VINYL-LP-1978-/311552047969,56.0                  
322016291276,Queen A Kind Of Magic NZ Orange Vinyl,http://www.ebay.co.uk/itm/Queen-Kind-Magic-NZ-Orange-Vinyl-/322016291276,165.0                                          
252288285264,Goldfrapp Black cherry vinyl record lp,http://www.ebay.co.uk/itm/Goldfrapp-Black-cherry-vinyl-record-lp-/252288285264,70.0                                    
331782523967,Reggae vinyl johny pram pram ,http://www.ebay.co.uk/itm/Reggae-vinyl-johny-pram-pram-/331782523967,73.0                                                       
391392294381,Various vinyl albums,http://www.ebay.co.uk/itm/Various-vinyl-albums-/391392294381,102.24 
Run Code Online (Sandbox Code Playgroud)

这是我的脚本来计算行数.

#!/bin/perl


open CSV2, "<csv2" or die;
@csv2=<CSV2>;
close CSV2;


%hash = @csv2;

@keys = keys %hash;
@values = values %hash;

$size = @values;
print "Hash size is $size";
Run Code Online (Sandbox Code Playgroud)

csv中的实际行数是6374,但是我的代码输出恰好是3187的一半.

我确信这有一个简单的解释,但为什么哈希的大小(即值/键的数量)不匹配我的csv中的行数?

Sin*_*nür 6

将列表分配给散列时,列表的偶数索引元素将成为键,列表中的奇数索引元素将成为值.因此,散列中的键的数量将是列表中的一半,而散列中的值的数量是散列中的一半,如果列表中的元素数是偶数,则列表中有元素.否则,哈希中的n/2 + 1键和n值将n是列表中元素的数量.

您可能想要做的是将元素插入到由CSV列0中的ID键入的哈希值中.

#!/usr/bin/env perl

use strict;
use warnings;

use Text::CSV_XS;

my @fields = qw( title url price);
my $csv = Text::CSV_XS->new({ allow_whitespace => 1});
my %data;

while (my $row = $csv->getline(\*DATA)) {
    my ($key) = shift @$row;
    next unless defined($key) and length($key);
    for ( @$row ) {
        s/^\s+//;
        s/\s+\z//;
    }
    @{ $data{$key} }{ @fields } = @$row;
}

use Data::Dumper;
print Dumper \%data;

__DATA__
311552047969,THE UPSETTERS   RETURN OF THE SUPER APE VINYL LP 1978 ,http://www.ebay.co.uk/itm/UPSETTERS-RETURN-SUPER-APE-VINYL-LP-1978-/311552047969,56.0
322016291276,Queen A Kind Of Magic NZ Orange Vinyl,http://www.ebay.co.uk/itm/Queen-Kind-Magic-NZ-Orange-Vinyl-/322016291276,165.0
252288285264,Goldfrapp Black cherry vinyl record lp,http://www.ebay.co.uk/itm/Goldfrapp-Black-cherry-vinyl-record-lp-/252288285264,70.0
331782523967,Reggae vinyl johny pram pram ,http://www.ebay.co.uk/itm/Reggae-vinyl-johny-pram-pram-/331782523967,73.0
391392294381,Various vinyl albums,http://www.ebay.co.uk/itm/Various-vinyl-albums-/391392294381,102.24
Run Code Online (Sandbox Code Playgroud)

产量

$ ./pppp.pl
$VAR1 = {
          '252288285264' => {
                              'url' => 'http://www.ebay.co.uk/itm/Goldfrapp-Black-cherry-vinyl-record-lp-/252288285264',
                              'title' => 'Goldfrapp Black cherry vinyl record lp',
                              'price' => '70.0'
                            },
          '322016291276' => {
                              'price' => '165.0',
                              'title' => 'Queen A Kind Of Magic NZ Orange Vinyl',
                              'url' => 'http://www.ebay.co.uk/itm/Queen-Kind-Magic-NZ-Orange-Vinyl-/322016291276'
                            },
          '311552047969' => {
                              'url' => 'http://www.ebay.co.uk/itm/UPSETTERS-RETURN-SUPER-APE-VINYL-LP-1978-/311552047969',
                              'title' => 'THE UPSETTERS   RETURN OF THE SUPER APE VINYL LP 1978',
                              'price' => '56.0'
                            },
          '331782523967' => {
                              'url' => 'http://www.ebay.co.uk/itm/Reggae-vinyl-johny-pram-pram-/331782523967',
                              'price' => '73.0',
                              'title' => 'Reggae vinyl johny pram pram'
                            },
          '391392294381' => {
                              'url' => 'http://www.ebay.co.uk/itm/Various-vinyl-albums-/391392294381',
                              'title' => 'Various vinyl albums',
                              'price' => '102.24'
                            }
        };