当前位置:  开发笔记 > 编程语言 > 正文

如何从命令行获取文件句柄?

如何解决《如何从命令行获取文件句柄?》经验,为你挑选了2个好方法。

我有一个子程序,它以文件句柄作为参数.如何从命令行上指定的文件路径创建文件句柄?我不想自己对这个文件进行任何处理,我只是想将它传递给另一个子程序,该子程序返回一个包含文件中所有已解析数据的哈希数组.

这是我正在使用的命令行输入:

$ ./getfile.pl /path/to/some/file.csv

这是我调用的子程序的开头看起来像:

sub parse {
    my $handle = shift;
    my @data   = <$handle>;
    while (my $line = shift(@data)) {
      # do stuff
    }
}

Michael Carm.. 16

命令行参数在预定义@ARGV数组中可用.您可以从那里获取文件名,并使用它open来打开文件句柄.假设您想要对文件进行只读访问,您可以这样做:

my $file = shift @ARGV;
open(my $fh, '<', $file) or die "Can't read file '$file' [$!]\n";
parse($fh);

请注意,or die...检查调用open是否成功,如果不成功则会返回错误消息.内置变量$!将包含失败时(OS相关的)错误消息,告知您调用未成功的原因.例如"许可被拒绝".



1> Michael Carm..:

命令行参数在预定义@ARGV数组中可用.您可以从那里获取文件名,并使用它open来打开文件句柄.假设您想要对文件进行只读访问,您可以这样做:

my $file = shift @ARGV;
open(my $fh, '<', $file) or die "Can't read file '$file' [$!]\n";
parse($fh);

请注意,or die...检查调用open是否成功,如果不成功则会返回错误消息.内置变量$!将包含失败时(OS相关的)错误消息,告知您调用未成功的原因.例如"许可被拒绝".



2> ephemient..:

parse(*ARGV) 是最简单的解决方案:解释有点长,但学习如何有效使用Perl的一个重要部分是学习Perl.

当你使用null filehandle(<>)时,它实际上从魔法ARGV文件句柄中读取,它具有特殊的语义:它从所有命名的文件中读取@ARGV,或者STDIN如果@ARGV是空的.

来自perldoc perlop:

null文件句柄<>很特殊:它可以用来模拟sed和awk的行为.输入来自<>标准输入,或来自命令行中列出的每个文件.以下是它的工作原理:第一次<>计算,@ARGV数组被检查,如果是空,$ARGV[0]则设置为"-",打开时为您提供标准输入.@ARGV然后将该数组作为文件名列表处理.循环

while (<>) {
    ...                     # code for each line
}

等效于以下类似Perl的伪代码:

unshift(@ARGV, '-') unless @ARGV;
while ($ARGV = shift) {
    open(ARGV, $ARGV);
    while () {
        ...         # code for each line
    }
}

除了说它不那么麻烦,并且实际上会有效.它确实会移动@ARGV数组并将当前文件名放入 $ARGV变量中.它也在ARGV内部使用文件句柄 - <>只是一个同义词,这是神奇的.(上面的伪代码不起作用,因为它被视为非魔法.)

你不必<>在一个while循环中使用- my $data = <>将从第一个非空文件中读取一行,一次my @data = <>;将它全部淹没,你可以*ARGV像传统的文件句柄一样传递.

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有