2017-08-09 9 views
0

サブにあるperlでcsvをハッシュに解析し、subに渡されたキーの値を引数として返します。サブのPerlハッシュにCSVを構文解析し、そのサブプールに渡された値を返します。

host1, 12121 
host2, 34324252345 
host3, 45345 
host4, 56363425 
host5, 3.1 
hostn, 435345 

そして、私のコードは次のようである::CSVファイルは次のようである

#!/usr/bin/perl -w 
my $host_key = getValue('host1'); 
print $host_key; 
sub getValue { 
    my $host_file = 'test.csv'; 
    my $hostname = $_[0]; 
    chomp($hostname); 
    my %hash; 
    open my $fh, '<', $host_file or die "Cannot open: $!"; 
    while (my $line = <$fh>) { 
     my @hostname_lines = split /,/, $line; 
     my $hostname = shift @hostname_lines; 
     $hash{$hostname} = \@hostname_lines; 
    } 
    close $fh; 
    my $host_value = $hash{$hostname}; 
    return $host_value; 
} 

私はこのコードを実行すると、私の戻り値は、ARRAY(0x6b72d0)だろうが、私は12121

の戻り値を期待します
+0

$ $ host_value = $ hash {'host1'} 私は$ host_value = 12121 – JavaRed

+0

が投稿されていることを期待しています。その1つのエラーのダイレクトフィックスとその他のオプションがあります。 (投稿したコメントをいくつか削除しました。) – zdim

答えて

2

whileループ内に配列の値を持つハッシュを作成します。

は、だから、その配列リファレンス内の要素を取得する必要が

my %host; 
... 
my $host_value = $host{$name}->[0]; 

数は今最初の要素であるように、元の配列は shift編されていた
my $host_value = $host{$name}[0]; 

のように書くことができますかarrayref内にあります。


splitの戻りリストの最初の要素が最初のスカラーになり、かつ配列に残りので、これは

while (my $line = <$fh>) { 
    my ($name, @numbers) = split /\s*,\s*/, $line; 
    $host{$name} = \@numbers; 
} 

としてもを行うことができます。


データには、各行のホストの番号が1つずつ表示されます。それはそう常にある場合、/\s*,\s*/も同様のスペースをトリム配列リファレンス

my %host; 
while (my $line = <$fh>) { 
    my ($name, $val) = split /\s*,\s*/, $line; 
    $host{$name} = $val; 
} 

の必要がない、または簡単に予想されるデータの形式を確認することができないの弱点を持っていても

my %host = map { split /\s*,\s*/ } <$fh>; 

関連する問題