Perl DBD::CSV:如何使用两个f_ext-options生成不同的行为;。csv";及";。csv/r";?

Perl DBD::CSV:如何使用两个f_ext-options生成不同的行为;。csv";及";。csv/r";?,perl,csv,dbi,Perl,Csv,Dbi,这来自DBD::文件文档: 外线 此属性用于设置打开(CSV)文件的文件扩展名。有几种可能性 在这种情况下,如果datadir中同时存在table.csv和table,则DBD::File将仅打开table.csv。该表仍将命名为table。如果您的datadir有扩展名为的文件,而您没有传递此属性,那么您的表名为table.csv,这可能不是您想要的。扩展始终不区分大小写。表名不正确 在这种情况下,扩展名是必需的,所有不匹配的文件名都将被忽略 我不可能使用两个选项“.csv/r”和“.csv”

这来自DBD::文件文档:

外线

此属性用于设置打开(CSV)文件的文件扩展名。有几种可能性

在这种情况下,如果datadir中同时存在table.csv和table,则DBD::File将仅打开table.csv。该表仍将命名为table。如果您的datadir有扩展名为的文件,而您没有传递此属性,那么您的表名为table.csv,这可能不是您想要的。扩展始终不区分大小写。表名不正确

在这种情况下,扩展名是必需的,所有不匹配的文件名都将被忽略


我不可能使用两个选项“.csv/r”和“.csv”生成不同的行为。有人能给我举个例子,我可以看到“.csv/r”和“.csv”之间的区别吗?

我似乎也不能让它做任何不同的事情。守则的有关部分如下:

sub file2table
{
    my ($data, $dir, $file, $file_is_tab, $quoted) = @_;

    $file eq "." || $file eq ".."       and return;

    my ($ext, $req) = ("", 0);
    if ($data->{f_ext}) {
        ($ext, my $opt) = split m/\//, $data->{f_ext};
        if ($ext && $opt) {
            $opt =~ m/r/i and $req = 1;
            }
        }

    (my $tbl = $file) =~ s/$ext$//i;
    $file_is_tab and $file = "$tbl$ext";

    # Fully Qualified File Name
    my $fqfn;
    unless ($quoted) { # table names are case insensitive in SQL
        opendir my $dh, $dir or croak "Can't open '$dir': $!";
        my @f = grep { lc $_ eq lc $file } readdir $dh;
        @f == 1 and $file = $f[0];
        closedir $dh or croak "Can't close '$dir': $!";
        }
    $fqfn = File::Spec->catfile ($dir, $file);

    $file = $fqfn;
    if ($ext) {
        if ($req) {
            # File extension required
            $file =~ s/$ext$//i                 or  return;
            }
        else {
            # File extension optional, skip if file with extension exists
            grep m/$ext$/i, glob "$fqfn.*"      and return;
            $file =~ s/$ext$//i;
            }
        }

    $data->{f_map}{$tbl} = $fqfn;
    return $tbl;
    } # file2table

现在,在DBD::File的0.39版中,此部分如下所示:

sub file2table
{
    my ($self, $meta, $file, $file_is_table, $respect_case) = @_;

    $file eq "." || $file eq ".."   and return; # XXX would break a possible DBD::Dir

    my ($ext, $req) = ("", 0);
    if ($meta->{f_ext}) {
    ($ext, my $opt) = split m/\//, $meta->{f_ext};
    if ($ext && $opt) {
        $opt =~ m/r/i and $req = 1;
        }
    }

    # (my $tbl = $file) =~ s/$ext$//i;
    my ($tbl, $dir, $user_spec_file);
    if ($file_is_table and defined $meta->{f_file}) {
    $tbl = $file;
    ($file, $dir, undef) = File::Basename::fileparse ($meta->{f_file});
    $user_spec_file = 1;
    }
    else {
    ($tbl, $dir, undef) = File::Basename::fileparse ($file, $ext);
    $user_spec_file = 0;
    }

    -d File::Spec->catdir ($meta->{f_dir}, $dir) or
    croak (File::Spec->catdir ($meta->{f_dir}, $dir) . ": $!");

    !$respect_case and $meta->{sql_identifier_case} == 1 and # XXX SQL_IC_UPPER
        $tbl = uc $tbl;
    !$respect_case and $meta->{sql_identifier_case} == 2 and # XXX SQL_IC_LOWER
        $tbl = lc $tbl;
    my $searchdir = File::Spec->file_name_is_absolute ($dir)
    ? $dir
    : Cwd::abs_path (File::Spec->catdir ($meta->{f_dir}, $dir));
    $searchdir eq $meta->{f_dir} and
    $dir = "";

    unless ($user_spec_file) {
    $file_is_table and $file = "$tbl$ext";

    # Fully Qualified File Name
    my $cmpsub;
    if ($respect_case) {
        $cmpsub = sub {
        my ($fn, undef, $sfx) = File::Basename::fileparse ($_, qr/\.[^.]*/);
        $fn eq $tbl and
            return (lc $sfx eq lc $ext or !$req && !$sfx);
        return 0;
        }
        }
    else {
        $cmpsub = sub {
        my ($fn, undef, $sfx) = File::Basename::fileparse ($_, qr/\.[^.]*/);
        lc $fn eq lc $tbl and
            return (lc $sfx eq lc $ext or !$req && !$sfx);
        return 0;
        }
        }

    opendir my $dh, $searchdir or croak "Can't open '$searchdir': $!";
    my @f = sort { length $b <=> length $a } grep { &$cmpsub ($_) } readdir $dh;
    @f > 0 && @f <= 2 and $file = $f[0];
    !$respect_case && $meta->{sql_identifier_case} == 4 and # XXX SQL_IC_MIXED
        ($tbl = $file) =~ s/$ext$//i;
    closedir $dh or croak "Can't close '$searchdir': $!";

    #(my $tdir = $dir) =~ s{^\./}{};    # XXX We do not want all tables to start with ./
    #$tdir and $tbl = File::Spec->catfile ($tdir, $tbl);
    $dir and $tbl = File::Spec->catfile ($dir, $tbl);

    my $tmpfn = $file;
    if ($ext) {
        if ($req) {
        # File extension required
    $tmpfn =~ s/$ext$//i            or  return;
        }
#       else {
#       # File extension optional, skip if file with extension exists
#       grep m/$ext$/i, glob "$fqfn.*"  and return;
#       $tmpfn =~ s/$ext$//i;
#       }
        }
    }

    my $fqfn = File::Spec->catfile ($searchdir, $file);
    my $fqbn = File::Spec->catfile ($searchdir, $tbl);

    $meta->{f_fqfn} = $fqfn;
    $meta->{f_fqbn} = $fqbn;
    !defined $meta->{f_lockfile} && $meta->{f_lockfile} and
    $meta->{f_fqln} = $meta->{f_fqbn} . $meta->{f_lockfile};

    $meta->{table_name} = $tbl;

    return $tbl;
    } # file2table
子文件2表
{
我的($self,$meta,$file,$file\u是表,$respect\u case)=@;
$file eq“.”| |$file eq“.”并返回;#XXX将破坏可能的DBD::Dir
我的($ext,$req)=(“”,0);
如果($meta->{f_ext}){
($ext,my$opt)=拆分m/\/,$meta->{f_ext};
如果($ext&&$opt){
$opt=~m/r/i和$req=1;
}
}
#(my$tbl=$file)=~s/$ext$//i;
我的($tbl,$dir,$user\u spec\u file);
if($file_是表,定义为$meta->{f_file}){
$tbl=$file;
($file,$dir,unde)=file::Basename::fileparse($meta->{f_file});
$user\u spec\u file=1;
}
否则{
($tbl,$dir,unde)=文件::基本名称::文件解析($File,$ext);
$user\u spec\u file=0;
}
-d文件::Spec->catdir($meta->{f_dir},$dir)或
croak(File::Spec->catdir($meta->{f_dir},$dir)。“:$!”;
!$REPART_case和$meta->{sql_identifier_case}==1和#XXX sql_IC_UPPER
$tbl=uc$tbl;
!$REPART_case和$meta->{sql_identifier_case}==2和#XXX sql_IC_LOWER
$tbl=信用证$tbl;
我的$searchdir=File::Spec->File\u name\u是绝对的($dir)
?$dir
:Cwd::abs_路径(File::Spec->catdir($meta->{f_dir},$dir));
$searchdir eq$meta->{f_dir}和
$dir=“”;
除非($user\u spec\u file){
$file_是_表和$file=“$tbl$ext”;
#完全限定文件名
我的$cmpsub;
如果($尊重案例){
$cmpsub=sub{
my($fn,unde,$sfx)=文件::基本名称::文件解析($\uqr/\.[^.]*/);
$fn eq$tbl和
返回(lc$sfx eq lc$ext或!$req&&!$sfx);
返回0;
}
}
否则{
$cmpsub=sub{
my($fn,unde,$sfx)=文件::基本名称::文件解析($\uqr/\.[^.]*/);
信用证$fn eq信用证$tbl和
返回(lc$sfx eq lc$ext或!$req&&!$sfx);
返回0;
}
}
opendir my$dh、$searchdir或croak“无法打开“$searchdir”:$!”;
my@f=sort{length$b length$a}grep{&$cmpsub($))readdir$dh;
@f>0&@f{sql_identifier_case}==4和#XXX sql_IC_混合
($tbl=$file)=~s/$ext$//i;
closedir$dh或croak“无法关闭'$searchdir':$!”;
#(my$tdir=$dir)=~s{^\./}{};#XXX我们不希望所有表都以开头/
#$tdir和$tbl=文件::规范->catfile($tdir,$tbl);
$dir和$tbl=File::Spec->catfile($dir,$tbl);
my$tmpfn=$file;
如果($ext){
如果($req){
#需要文件扩展名
$tmpfn=~s/$ext$//i或return;
}
#否则{
##文件扩展名可选,如果存在扩展名为的文件,则跳过
#grep m/$ext$/i,glob“$fqfn.*”并返回;
#$tmpfn=~s/$ext$//i;
#       }
}
}
my$fqfn=File::Spec->catfile($searchdir,$File);
my$fqbn=File::Spec->catfile($searchdir,$tbl);
$meta->{f_fqfn}=$fqfn;
$meta->{f_fqbn}=$fqbn;
!已定义$meta->{f_lockfile}&&$meta->{f_lockfile}和
$meta->{f_fqln}=$meta->{f_fqbn}.$meta->{f_lockfile};
$meta->{table_name}=$tbl;
返回$tbl;
}#文件2表格

就我所见,两个f_ext-options的工作情况与预期一致。

这是否说明了两者的区别

sandbox % echo "a,b,c" > foo sandbox % echo "a,b,c" > foo.csv sandbox % echo "a,b,c" > bar sandbox % echo "a,b,c" > baz.csv sandbox % perl -MDBI -wle'print for DBI->connect("dbi:CSV:f_ext=.csv")->tables' "merijn".baz "merijn".bar "merijn".foo sandbox % perl -MDBI -wle'print for DBI->connect("dbi:CSV:f_ext=.csv/r")->tables' "merijn".baz "merijn".foo sandbox % 沙盒%echo“a、b、c”>foo 沙盒%echo“a、b、c”>foo.csv 沙盒%echo“a、b、c”>条 沙盒%echo“a、b、c”>baz.csv 沙盒%perl-MDBI-wle'print for DBI->connect(“DBI:CSV:f_ext=.CSV”)->tables' “merijn”,baz “merijn”酒吧 “merijn”,foo 沙盒%perl-MDBI-wle'print for DBI->connect(“DBI:CSV:f_ext=.CSV/r”)->tables' “merijn”,baz “merijn”,foo 沙箱%
f_ext=.csv
只将
.csv
作为首选项,而不是要求:在第一种情况下,仍然使用没有.csv扩展名的文件“bar”,但选择“foo.csv”而不是“foo”。使用
f_ext=.csv/r“
,“bar”被忽略,因为它没有“.csv”扩展名。

如果“my@f=grep{lc$\ueq lc$file}readdir$dh;“-grep找不到文件?
sub file2table
{
    my ($self, $meta, $file, $file_is_table, $respect_case) = @_;

    $file eq "." || $file eq ".."   and return; # XXX would break a possible DBD::Dir

    my ($ext, $req) = ("", 0);
    if ($meta->{f_ext}) {
    ($ext, my $opt) = split m/\//, $meta->{f_ext};
    if ($ext && $opt) {
        $opt =~ m/r/i and $req = 1;
        }
    }

    # (my $tbl = $file) =~ s/$ext$//i;
    my ($tbl, $dir, $user_spec_file);
    if ($file_is_table and defined $meta->{f_file}) {
    $tbl = $file;
    ($file, $dir, undef) = File::Basename::fileparse ($meta->{f_file});
    $user_spec_file = 1;
    }
    else {
    ($tbl, $dir, undef) = File::Basename::fileparse ($file, $ext);
    $user_spec_file = 0;
    }

    -d File::Spec->catdir ($meta->{f_dir}, $dir) or
    croak (File::Spec->catdir ($meta->{f_dir}, $dir) . ": $!");

    !$respect_case and $meta->{sql_identifier_case} == 1 and # XXX SQL_IC_UPPER
        $tbl = uc $tbl;
    !$respect_case and $meta->{sql_identifier_case} == 2 and # XXX SQL_IC_LOWER
        $tbl = lc $tbl;
    my $searchdir = File::Spec->file_name_is_absolute ($dir)
    ? $dir
    : Cwd::abs_path (File::Spec->catdir ($meta->{f_dir}, $dir));
    $searchdir eq $meta->{f_dir} and
    $dir = "";

    unless ($user_spec_file) {
    $file_is_table and $file = "$tbl$ext";

    # Fully Qualified File Name
    my $cmpsub;
    if ($respect_case) {
        $cmpsub = sub {
        my ($fn, undef, $sfx) = File::Basename::fileparse ($_, qr/\.[^.]*/);
        $fn eq $tbl and
            return (lc $sfx eq lc $ext or !$req && !$sfx);
        return 0;
        }
        }
    else {
        $cmpsub = sub {
        my ($fn, undef, $sfx) = File::Basename::fileparse ($_, qr/\.[^.]*/);
        lc $fn eq lc $tbl and
            return (lc $sfx eq lc $ext or !$req && !$sfx);
        return 0;
        }
        }

    opendir my $dh, $searchdir or croak "Can't open '$searchdir': $!";
    my @f = sort { length $b <=> length $a } grep { &$cmpsub ($_) } readdir $dh;
    @f > 0 && @f <= 2 and $file = $f[0];
    !$respect_case && $meta->{sql_identifier_case} == 4 and # XXX SQL_IC_MIXED
        ($tbl = $file) =~ s/$ext$//i;
    closedir $dh or croak "Can't close '$searchdir': $!";

    #(my $tdir = $dir) =~ s{^\./}{};    # XXX We do not want all tables to start with ./
    #$tdir and $tbl = File::Spec->catfile ($tdir, $tbl);
    $dir and $tbl = File::Spec->catfile ($dir, $tbl);

    my $tmpfn = $file;
    if ($ext) {
        if ($req) {
        # File extension required
    $tmpfn =~ s/$ext$//i            or  return;
        }
#       else {
#       # File extension optional, skip if file with extension exists
#       grep m/$ext$/i, glob "$fqfn.*"  and return;
#       $tmpfn =~ s/$ext$//i;
#       }
        }
    }

    my $fqfn = File::Spec->catfile ($searchdir, $file);
    my $fqbn = File::Spec->catfile ($searchdir, $tbl);

    $meta->{f_fqfn} = $fqfn;
    $meta->{f_fqbn} = $fqbn;
    !defined $meta->{f_lockfile} && $meta->{f_lockfile} and
    $meta->{f_fqln} = $meta->{f_fqbn} . $meta->{f_lockfile};

    $meta->{table_name} = $tbl;

    return $tbl;
    } # file2table
sandbox % echo "a,b,c" > foo sandbox % echo "a,b,c" > foo.csv sandbox % echo "a,b,c" > bar sandbox % echo "a,b,c" > baz.csv sandbox % perl -MDBI -wle'print for DBI->connect("dbi:CSV:f_ext=.csv")->tables' "merijn".baz "merijn".bar "merijn".foo sandbox % perl -MDBI -wle'print for DBI->connect("dbi:CSV:f_ext=.csv/r")->tables' "merijn".baz "merijn".foo sandbox %