サブルーチンの結果
my @data; my ($rows,$cols);
sub Gettest {
use Text::ParseWords;
my $dfile = shift; # CSVファイル
my @array = @_; @data = ();
open(IN, $dfile) or exit(-1);#
while(<IN>) { chomp;
my @fields = quotewords("," => 0 , $_); # カンマデータの取込
foreach my $field (@fields){
if(index($field, ":") >= 0) {
my @range = split(':',$field);# 範囲の取出し
$field = sub { my $v = shift; return $range[0] <= $v && $v <= $range[1];};
} elsif(index($field, ",") >= 0) {
my @list = split(',',$field); #種類の取出し
$field = sub { my $v = shift; return grep($v == $_, @list); };}}
push @data, [@fields];}
close(IN);
$rows = @data; $cols = @{$data[0]};
return squeezed(@array);#// 該当範囲の絞り込み}
sub squeezed {
my @para = @_; my @pos = (0 .. ($cols -1));
my $i; my @wk;
for($i = 0; $i < $rows -1; $i++) {
@wk = ();
foreach my $p (@pos) {# 有効な位置
my $test = $data[$i]->[$p];
if("CODE" eq ref($test)){ # 範囲テストコードの場合
push @wk, $p if &$test($para[$i]); # test がOK
} elsif($para[$i] eq /$test/) {push @wk, $p; # マッチ位置を配列に}}
@pos = @wk;}
if(@pos == 1){ return $data[-1]->[$pos[0]];
} else {return undef;#// 該当なしか2個以上ならundefを返却
}}1;
引数によってCSVデータの範囲を絞って結果を返すといった関数を、ご提供して頂いた
のですが、「1:4」や「1,3,4」等の答えがCODE(XXX)になってしまいます。ご提供者様から、ループで変換するのではなく
最終行のみ変更を加えないようにするというアドバイスを頂いて色々ためしてみたのですが、
私のレベルではサブルーチンの理解が出来なくて全然うまくいきません。他力本願な
お願いで申し訳ないのですが、解る方教えて下さい。