Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl eval命令未按预期工作_Perl_Eval - Fatal编程技术网

Perl eval命令未按预期工作

Perl eval命令未按预期工作,perl,eval,Perl,Eval,我有一种perl终端,我们称之为我已经编写的,编写它的想法是我想逐行运行perl代码,允许我在现有的大型数据集上运行新命令,而无需更改脚本、重新加载数据集并重新运行脚本 请注意,我差不多一年前就写了这篇文章,这主要是一个关于动态功能平板电脑的学习实验,但是现在我对它有了一些用途,并发现了一些阻碍我使用它的问题 因此,我评估了用户输入的命令,但是,它们的行为并不像预期的那样,也许有人可以解释为什么会这样 这是“重要”位,命令行数据存储在@args中,第一个元素存储在$prog中。我检查是否存在允许

我有一种perl终端,我们称之为我已经编写的,编写它的想法是我想逐行运行perl代码,允许我在现有的大型数据集上运行新命令,而无需更改脚本、重新加载数据集并重新运行脚本

请注意,我差不多一年前就写了这篇文章,这主要是一个关于动态功能平板电脑的学习实验,但是现在我对它有了一些用途,并发现了一些阻碍我使用它的问题

因此,我评估了用户输入的命令,但是,它们的行为并不像预期的那样,也许有人可以解释为什么会这样

这是“重要”位,命令行数据存储在@args中,第一个元素存储在$prog中。我检查是否存在允许用户创建函数的现有函数,如果没有,我会尝试并评估该命令

if(exists($actions{$prog})){
        print "\n";
        $actions{$prog}->(@args);
        print "\n";
}else{
        print "\nEVALing '$command'\n";
        eval $command;
        warn $@ if $@;
        print "\n";
}
从下面可以看出,它在标量赋值方面与预期的一样工作,但在数组和哈希赋值方面失败

user@host:~/$ perl term.pl 
1358811935>$a = 0;
EVALing '$a = 0;'

1358811937>print $a;
EVALing 'print $a;'
0
1358811944>@b = qw(2 3);                                                                                                      
EVALing '@b = qw(2 3);'
Global symbol "@b" requires explicit package name at (eval 5) line 1.

1358811945>print @b;
EVALing 'print @b;'
Global symbol "@b" requires explicit package name at (eval 6) line 1.

1358812008>my @b = qw(2 3);                                                                                                   
EVALing 'my @b = qw(2 3);'

1358812008>print "@b";
EVALing 'print "@b";'
Possible unintended interpolation of @b in string at (eval 9) line 1.
Global symbol "@b" requires explicit package name at (eval 9) line 1.

1358812016>print join(',',@b);                                                                                                
EVALing 'print join(',',@b);'
Global symbol "@b" requires explicit package name at (eval 10) line 1.

1358812018>

变量$a和$b是特殊的,因为它们是按排序使用的。因此,如果没有声明,strict不会抱怨。使用$x会触发与数组和哈希相同的错误。

变量$a和$b是特殊的,因为它们是按排序使用的。因此,如果没有声明,strict不会抱怨。使用$x会触发与数组和散列相同的错误。

对于这种情况,您可能希望通过不使用严格的“vars”来允许使用任意包变量;。在eval'd代码中声明一个词法my变量将起作用,但下一次eval将不再适用

user@host:~/$ perl term.pl 
1358811935>$a = 0;
EVALing '$a = 0;'

1358811937>print $a;
EVALing 'print $a;'
0
1358811944>@b = qw(2 3);                                                                                                      
EVALing '@b = qw(2 3);'
Global symbol "@b" requires explicit package name at (eval 5) line 1.

1358811945>print @b;
EVALing 'print @b;'
Global symbol "@b" requires explicit package name at (eval 6) line 1.

1358812008>my @b = qw(2 3);                                                                                                   
EVALing 'my @b = qw(2 3);'

1358812008>print "@b";
EVALing 'print "@b";'
Possible unintended interpolation of @b in string at (eval 9) line 1.
Global symbol "@b" requires explicit package name at (eval 9) line 1.

1358812016>print join(',',@b);                                                                                                
EVALing 'print join(',',@b);'
Global symbol "@b" requires explicit package name at (eval 10) line 1.

1358812018>
或者,预先声明一组用于评估代码的变量,可能包括%misc散列


另一种完全不同的方法是,如果打印输出是一个因素,则每次通过计算到目前为止输入的所有代码的串联,将输出重定向到输入的最新代码。

对于这种情况,您可能希望通过不说严格的“vars”来允许使用任意包变量;。在eval'd代码中声明一个词法my变量将起作用,但下一次eval将不再适用

或者,预先声明一组用于评估代码的变量,可能包括%misc散列


如果打印输出是一个因素,则一种完全不同的方法是每次通过计算到目前为止输入的所有代码的串联,将输出重定向到最近输入的代码。

哇,我甚至没有想到这一点,我一直将排序改为{$A$b}。关于我的评估为什么不起作用有什么建议吗?好吧,看起来使用起来很严格;是问题所在,没有严格限制,它的功能如预期。请尽可能使用严格限制的部分;防止无意的符号引用或空话是一件好事。使用严格的“subs”、“refs”;或严格使用;没有严格的“变量”;哇,我甚至没有想到这一点,我一直把我的排序修改为{$a$b}。关于我的评估为什么不起作用有什么建议吗?好吧,看起来使用起来很严格;是问题所在,没有严格限制,它的功能如预期。请尽可能使用严格限制的部分;防止无意的符号引用或空话是一件好事。使用严格的“subs”、“refs”;或严格使用;没有严格的“变量”;如果您只想以交互方式运行perl,请使用调试器:perl-de1…..这将非常好地工作。哎呀。哦,好吧,我想我会把这归功于在动态函数表中的良好学习体验-__-如果您只想以交互方式运行perl,请使用调试器:perl-de1…..这将非常好地工作。哎呀。哦,好吧,我想我会把这归功于在动态函数表中的良好学习体验-__-