检查参数是文件名还是包含文件名列表的文件的最佳方法是什么?

时间:2011-08-24 19:30:14

标签: linux perl unix

我正在编写一个Perl脚本,我希望让用户在$ ARGV [0]中输入包含文件列表的文件或文件。

我正在做的当前方式是检查文件名是否以@开头,如果是,则将该文件视为文件名列表。

这绝对不是理想的做法,因为我注意到@是bash中的一个特殊字符(顺便说一下它做了什么?我只看到它在bash中的$ @中使用过)。

3 个答案:

答案 0 :(得分:5)

您可以在命令行中指定其他参数来区别对待,例如

perl script.pl file

用于阅读文件的内容,或

perl script.pl -l file

用于从文件中读取文件列表。

您可以使用getopt模块来更轻松地解析输入参数。

答案 1 :(得分:1)

首先,您可以使用shell为您抓取列表:

perl script.pl <( cat list )

如果您不想这样做,可能是因为您在最大命令行长度下运行,可以在使用@ARGVARGV之前使用以下内容(包括<> }):

@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/.../

否则,以@开头的文件名在命令行参数中具有相当不错的优先级。