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で
は、配列ではない '[1,2]'配列リファレンスではありません; 'my $ cols'に保存してはいけません。逆参照( 'foreach(@ $ cols)'のように)? – raina77ow
すべての変数がクラス変数であれば、なぜオブジェクトをインスタンス化するのですか? – bytepusher
@ raina77owあなたが正しいです、[1,2]は配列参照です。私はそれを知りませんでした。 '@cols = @ {$ opts - > {'columns'}};'のようなデリファレンスされた値を格納すると動作します。しかし、どうすれば配列を渡して動作させることができますか?私は '$ parser-> setOpts({'delimeter' => '、'、 'columns' =>(1,2)}); 'のように渡してみましたが、配列の最初の値だけが保存されています'@ cols'配列の中で –