gpt4 book ai didi

perl - 在 perl 中传递命令行参数

转载 作者:行者123 更新时间:2023-12-01 00:52:40 26 4
gpt4 key购买 nike

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

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:不匹配。谁能帮我解决以下问题。

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

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

最佳答案

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

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

这不是您想要的,如果您的 $RUN_DIR 目录中没有 b1.txt

,将无法找到任何文件

为了防止 shell 使用通配 rune 件模式,你只需要将它放在引号中,这样你的命令就变成了

perl Test.pl 'b*.txt'

除此之外,您的程序确实需要改进。您应该始终在所有程序的开头使用严格使用警告,并在首次使用时声明每个变量;你真的应该只使用 @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;
}

关于perl - 在 perl 中传递命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12451929/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com