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

时间:2015-05-06 11:49:26

标签: bash perl shell posix command-line-arguments

尝试在perl中找到以下的等效解决方案。假设我有以下POSIX shell脚本:

#!/bin/sh

MY_CMD='WDT=$1; shift ; printf "%-${WDT}.${WDT}s\n" "$@"'
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的输入中提供这些参数。

SYNOPSYS会 ./perl_script.pl my_command_name [param1 [param2 ... [paramN]]]

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

perl等价物将类似于:

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

3 个答案:

答案 0 :(得分:0)

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

function M = mymat(n,m)
M = toeplitz(mod(1:n,2), mod(1:m,2));
end

答案 1 :(得分:0)

您的请求有两个要素。

首先 - 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}s\n", $word );
}

答案 2 :(得分:0)

  

如何使用perl执行相同操作。

Perl也有eval() function。它可以采用字符串并在调用它的上下文中对其进行评估。

  

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

您必须在eval&#39}编辑Perl代码可以访问之前创建变量。根据实施情况,这也会直接绕过或与use strict冲突。

我没有两种方法来创建变量:使用eval或通过操纵the symbol table创建变量。考虑:

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->();