我有一个子程序,它以文件句柄作为参数.如何从命令行上指定的文件路径创建文件句柄?我不想自己对这个文件进行任何处理,我只是想将它传递给另一个子程序,该子程序返回一个包含文件中所有已解析数据的哈希数组.
这是我正在使用的命令行输入:
$ ./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相关的)错误消息,告知您调用未成功的原因.例如"许可被拒绝".
命令行参数在预定义@ARGV
数组中可用.您可以从那里获取文件名,并使用它open
来打开文件句柄.假设您想要对文件进行只读访问,您可以这样做:
my $file = shift @ARGV; open(my $fh, '<', $file) or die "Can't read file '$file' [$!]\n"; parse($fh);
请注意,or die...
检查调用open
是否成功,如果不成功则会返回错误消息.内置变量$!
将包含失败时(OS相关的)错误消息,告知您调用未成功的原因.例如"许可被拒绝".
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
像传统的文件句柄一样传递.