PerlでCSV開いて取り出した値を正規表現でパターンマッチしてるところでハマった。
やり方を変えてText::CSV_XS を使ったら問題なくできたので原因はわかってない。
plan1 で $id の末尾に何かが入っていそうということは調べていくうちにわかったが、それがなにかはわかってない。
my $filename = "filename.csv"; my $valid_id_pattern = qr{[1-9][0-9]*}; # plan 1(失敗) say 'plan1'; open my $fh1, '<:encoding(utf8)', './file/' . $filename or die; while (my $line = <$fh1>) { chomp $line; my ($title, $id) = split /,/, $line; if ($id =~ /\A$valid_id_pattern\z/) { say "valid id:$id"; } else { say "invalid id:$id"; } } # plan 2(成功) say 'plan 2 using Text::CSV_XS'; open my $fh2, '<:encoding(utf8)', './file/' . $filename or die; my $csv = Text::CSV_XS->new(+{ binary => 1 }); $csv->column_names(qw/title id/); while (my $row = $csv->getline_hr($fh2)) { my $id = $row->{id}; if ($id =~ /\A$valid_id_pattern\z/) { say "valid id:$id"; } else { say "invalid id:$id"; } } exit 0;
出力
plan1 invalid id: 123 invalid id: 456 plan 2 using Text::CSV_XS valid id: 123 valid id: 456