尝试在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");
但这当然不能按预期工作。
答案 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->();