我正在编写一个Perl脚本,我希望让用户在$ ARGV [0]中输入包含文件列表的文件或文件。
我正在做的当前方式是检查文件名是否以@开头,如果是,则将该文件视为文件名列表。
这绝对不是理想的做法,因为我注意到@是bash中的一个特殊字符(顺便说一下它做了什么?我只看到它在bash中的$ @中使用过)。
答案 0 :(得分:5)
您可以在命令行中指定其他参数来区别对待,例如
perl script.pl file
用于阅读文件的内容,或
perl script.pl -l file
用于从文件中读取文件列表。
您可以使用getopt模块来更轻松地解析输入参数。
答案 1 :(得分:1)
首先,您可以使用shell为您抓取列表:
perl script.pl <( cat list )
如果您不想这样做,可能是因为您在最大命令行长度下运行,可以在使用@ARGV
或ARGV
之前使用以下内容(包括<>
}):
@ARGV = map {
if (my $qfn = /^\@(.*)/s) {
if (!open(my $fh, '<', $qfn)) {
chomp( my @args = <$fh> );
@args
} else {
warn("Can't open $qfn: $!\n");
()
}
} else {
$_
}
} @ARGV;
请注意,如果您的文件名称以“@”开头,则会产生意外的副作用。
答案 2 :(得分:0)
'@'
在 Perl 中很特殊,因此您需要在Perl字符串中对其进行转义 - 除非您使用非插值字符串类型{ {1}}或'a non-interpolating $string'
或者你需要逃避它,就像这样
q(another non-interpolating $string)
插值分隔符是以下任何一种:
if ( $arg =~ /^\@/ ) {
...
}
或"..."
qq/.../
或`...`
qx/.../
或/.../
对于所有这些,你必须逃避任何文字qr/.../
。
否则,以@
开头的文件名在命令行参数中具有相当不错的优先级。