2017-05-15 8 views
0

私のクラスにハッシュの配列を渡すための最良の方法は、以下のようになります。Perlは:サブ

package CSVKeepCols; 

use strict; 
use warnings; 
use Text::CSV; 
use Data::Dumper; 

my $text; 
my $del; 
my @cols; 
my $output = ''; 

sub load { 
    my $class = shift; 
    my $self = {}; 
    bless $self; 
    return $self; 
} 

sub input { 
    my $class = shift; 
    $text = shift; 
    return $class; 
} 

sub setOpts { 
    my ($class, $opts) = @_; 
    $del = $opts->{'delimeter'}; 
    @cols = $opts->{'columns'}; 
} 

sub process { 
    my @lines = split /\n|\r|\n\r|\r\n/, $text; 
    my $csv = Text::CSV->new({ sep_char => $del }); 

    foreach (@lines) { 
     die('Invalid CSV data') if !$csv->parse($_); 
     $output .= __filterFields($csv->fields()) . "\n"; 
    } 
} 

sub output { 
    return $output; 
} 

sub __filterFields { 
    my @fields = @_; 
    my $line = ''; 

    foreach (@cols) { 
     $line .= ',' if $line; 
     $line .= $fields[$_]; 
    } 

    return $line; 
} 

1; 

私はこのように私のコードからこのクラスを使用しています:私は期待してい

$parser = load CSVKeepCols(); 
$parser->input($out); 
$parser->setOpts({'delimeter' => ',', 'columns' => [1,2]}); 
$parser->process(); 
$out = $parser->output(); 

setOptsサブルーチンは{'delimeter' => ',', 'columns' => [1,2]}のハッシュをとり、そこから$delの値を,@colsから(1,2)に設定し、@colsの配列をループすることができます。私は__filterFieldsサブルーチンで@colsをループしようとすると、

はしかし、私はエラー

Use of reference "ARRAY(0x22e32e0)" as array index at CSVKeepCols.pm line 52.

私はこれをどのように修正すればよいのですか? setOptsで

+0

は、配列ではない '[1,2]'配列リファレンスではありません; 'my $ cols'に保存してはいけません。逆参照( 'foreach(@ $ cols)'のように)? – raina77ow

+0

すべての変数がクラス変数であれば、なぜオブジェクトをインスタンス化するのですか? – bytepusher

+0

@ raina77owあなたが正しいです、[1,2]は配列参照です。私はそれを知りませんでした。 '@cols = @ {$ opts - > {'columns'}};'のようなデリファレンスされた値を格納すると動作します。しかし、どうすれば配列を渡して動作させることができますか?私は '$ parser-> setOpts({'delimeter' => '、'、 'columns' =>(1,2)}); 'のように渡してみましたが、配列の最初の値だけが保存されています'@ cols'配列の中で –

答えて

3

は、@cols = $opts->{columns};

$opts->{columns}を設定するアレイ([1,2])への参照を含みます。 __filterFields中のSO

sub setOpts { 
    # ... 
    @cols = @{ $opts->{columns} }; 

} 

編集:

for (@cols){ 
    # $_ is an arrayref [1,2] 
    # you are using it as an index to retrieve a value from @fields 
    $line .= $fields[$_]; 
    # Thus the error: "use of reference ARRAY"..." as array index" 
    # You should be using an integer here. 
} 

はそれを修正するために除去不要なチェック