如何将字符串解释为命令以在 perl 中使用参数执行



试图在perl中找到一个等效的解决方案。假设我有以下 POSIX 外壳脚本:

#!/bin/sh
MY_CMD='WDT=$1; shift ; printf "%-${WDT}.${WDT}sn" "$@"'
eval $MY_CMD

假设上述内容被保存为my_script.sh

如果我像这样执行它:./my_script.sh 4 Hello to thise nice girls那么输出将是这样的:

Hell
to
this
nice
girl

我如何使用perl做同样的事情。这里的主要问题是我如何获取perl输入参数并将它们传递给保存在变量中的命令,以便这些参数将根据输入中的参数进行评估(在shell中eval正确地执行此操作)。

如果我问了非常愚蠢的问题,请原谅我,因为我刚刚开始学习perl.o)

编辑:我想我需要用这个问题更多地澄清自己...... 我需要在变量中拥有命令。我在这里简化了脚本示例,以便轻松理解问题。到目前为止,在所有解决方案中,您都为我提供了如何在perl中完成相同任务的解决方案,但请不要关注命令本身,这只是一个例子:

其他例子是:MY_CMD='export AWKNUMF="%.2f"; exe 93 "$1" "$2" "$3" $(shift 3; echo "$@") | sort -k1,1 | exe 93 ":" 1 2'

等等...

MY_CMD变量将填充从存储库中检索到的一些命令的想法,该存储库需要一些参数,我希望这些参数在perl的输入中提供。

新思科技将是./perl_script.pl my_command_name [param1 [param2 ... [paramN]]]

这里的要点是,您不应该关注MY_CMD变量的内容。它只是一个获取参数的 shell 命令。

Perl 等价物是这样的:

system ($my_cmd, "@ARGV");但这当然不能按预期工作。

Perl 中不需要 eval (我怀疑在 shell 中也不需要它)。

#!/usr/bin/perl
use warnings;
use strict;
my $width = shift;
printf "%-$width.${width}sn", $_ for @ARGV;

您的请求有两个元素。

首先 - perl 使用@ARGV来保存命令行参数。您可以使用shift$ARGV[1]访问单个元素。

其次 -eval在perl中也可以工作 - 但你可能会发现有更好的方法来做你想做的事情。

所以举个例子:

#!/usr/bin/perl
use strict;
use warnings;
my ( $WDT, @words ) = @ARGV; 
foreach my $word ( @words ) {
printf ( "%-${WDT}.${WDT}sn", $word );
}

如何使用perl做同样的事情。

Perl 也有eval()函数。它可以获取一个字符串并在调用它的上下文中对其进行评估。

这里的主要问题是我如何获取perl输入参数并将它们传递给保存在变量中的命令,以便这些参数将根据输入中的参数进行评估(在shell中eval正确地执行此操作)。

您必须先创建变量,然后evalPerl 代码才能访问。根据实施情况,这也将绕过或直接与use strict冲突。

我有两种创建变量的方法:使用eval或通过操作符号表来创建它们。考虑:

my $value_of_a = 10;
my $value_of_b = 20;
# alt1 : create vars using `eval`
eval '$a = '.$value_of_a;
eval '$b = '.$value_of_b;
eval q{ print "$a + $b = ", $a+$b, "n"; };
# alt2 : create the vars by manipulating the symbol table directly
$var_name = "aa";
${"::$var_name"} = $value_of_a;
$var_name = "bb";
${"::$var_name"} = $value_of_b;
eval q{ print "$aa + $bb = ", $aa+$bb, "n"; };

为了避免每次都调用eval来解释代码,还可以尝试将代码包装到无名函数中,并eval一次以创建可以随时调用的子例程。考虑:

# the input data:
my $var_name_a = 'a';
my $var_name_b = 'b';
my $value_of_a = 10;
my $value_of_b = 20;
my $cmd = 'print "$a + $b = ", $a+$b, "n";';
# the preparations:
eval '$'.$var_name_a.' = '.$value_of_a;
eval '$'.$var_name_b.' = '.$value_of_b;
my $sub = eval 'sub { '. $cmd .' }';
# the execution:
$sub->();

相关内容

  • 没有找到相关文章

最新更新