试图在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正确地执行此操作)。
您必须先创建变量,然后eval
Perl 代码才能访问。根据实施情况,这也将绕过或直接与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->();