【问题标题】:passing command line arguments in perl在 perl 中传递命令行参数
【发布时间】:2012-09-09 05:40:46
【问题描述】:

我在分配参数值/命令行参数时遇到了麻烦。这是我真正想做的。

Test.pl
#!/usr/bin/perl

#Variable declaration

$RUN_DIR="/home/ckhau/database/experiment/test";
    #Main program

$index=-999; 
#my $ARGV;
@files = <$RUN_DIR/b*.txt>;

foreach $file (@files)
{
 #$SCRIPT="perl abcdinfo.pl $file";
 $SCRIPT="perl abc.pl $file";
 system("$SCRIPT");       
}

我尝试用 @ARGV 替换 b*.txt 并尝试运行程序,即当我用

替换上面的代码时
@files = <$RUN_DIR/@ARGV>;

然后尝试用命令行运行

perl Test.pl b*.txt

这给了我一个错误 perl: no match。任何人都可以在以下方面帮助我。

如何为此使用命令行参数???

我可以在命令行“b*.txt”或“r_*.txt”中使用这些语法吗???

【问题讨论】:

  • 这可能与 shell 不能很好地处理命令行参数中的 * 有关。
  • 你在哪个 shell 中运行这个脚本? Windows 命令提示符? Linux bash 外壳?
  • @Jonah Bishop:我正在使用 linux
  • 请出示实际有问题的代码。
  • @ikegami 我已经编辑了帖子。

标签: perl command-line-arguments


【解决方案1】:

shell 正在尝试将b*.txt 扩展为您当前目录中的匹配文件列表。一旦你的程序收到这些值,你的glob 看起来像

@files = </home/ckhau/database/experiment/test/b1.txt b3.txt b3.txt>

这不是您想要的,如果您的$RUN_DIR 目录中没有b1.txt,将无法找到任何文件

为了防止 shell 使用通配符文件模式,您只需将其放在引号中,这样您的命令就变成了

perl Test.pl 'b*.txt'

除此之外,您的程序确实需要改进。您应该始终use strictuse warnings 放在所有程序的开头,并在第一次使用时声明每个变量;你真的应该只使用@ARGV 的第一个元素作为你的文件模式,而不是整个数组;当你只是想要它们的内容时,将标量变量放在引号中是错误的

看看你原来的重构

#!/usr/bin/perl

use strict;
use warnings;

my $run_dir="/home/ckhau/database/experiment/test";

my $pattern = "$run_dir/$ARGV[0]";

my $index = -999; 
my @files = glob $pattern;

foreach my $file (@files) {
  my $script = "perl abc.pl '$file'";
  system $script;
}

更新

如果您真的想要将多个通配符模式作为Test.pl 的参数,那么您必须将$run_dir 目录修补到每个通配符的开头。最好的方法是使用File::Spec 模块的rel2abs 函数。完整的脚本如下所示

#!/usr/bin/perl

use strict;
use warnings;

use File::Spec;

my $run_dir="/home/ckhau/database/experiment/test";

my $pattern = join ' ', map File::Spec->rel2abs($_, $run_dir), @ARGV;

my $index = -999;
my @files = glob $pattern;

foreach my $file (@files) {
  my $script = "perl abc.pl '$file'";
  system $script;
}

【讨论】:

  • 你在更新中提到的那个是我真正想要的那个,即我将不得不提供许多通配符模式但我无法安装这些 CPAN 模块,所以如果没有这些模块,他们有更好的方法来做到这一点。
  • +1 建议新手使用“使用严格”和“使用警告”
  • @unkaitha:你是说你不能安装 CPAN 模块是因为你的机器上没有 root 权限吗?如果是这样,您可以按照以下说明将模块安装到您选择的非系统 Perl 区域:linuxgazette.net/139/okopnik.html
  • @unkaitha:如果您确实启动并运行了您的个人 CPAN 库,请考虑使用 Readonly 模块。我注意到您将 $RUN_DIR 全部大写...如果您打算将其设为常量,则可以“使用 Readonly; Readonly $RUN_DIR => '/home/ckhau/database/experiment/test';”
猜你喜欢
  • 2018-04-07
  • 1970-01-01
  • 2016-03-25
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
相关资源
最近更新 更多