我遇到了需要从服务器访问javascript对象的情况.服务器返回函数或对象的字符串名称,并且基于其他元数据,我将以不同方式评估对象.
最初我正在评估(eval([string])),一切都很好.最近我更新了函数,以免eval安全性让人高枕无忧,我遇到了命名空间对象/函数的问题.
具体来说,我尝试eval([name])用a 替换a window[name]来通过全局对象vs的方括号语法访问对象eval.
但是我遇到了命名空间对象的问题,例如:
var strObjName = 'namespace.serviceArea.function';
// if I do
var obj = eval(strObjName); // works
// but if I do
var obj = window[strObjName]; // doesn't work
Run Code Online (Sandbox Code Playgroud)
任何人都可以提出一个很好的解决方案,以避免使用eval命名空间字符串?
我有一段Perl代码,有点像下面这样(强烈简化):有一些级别的嵌套子程序调用(实际上是方法),而一些内部代码执行自己的异常处理:
sub outer { middle() }
sub middle {
eval { inner() };
if ( my $x = $@ ) { # caught exception
if (ref $x eq 'ARRAY') {
print "we can handle this ...";
}
else {
die $x; # rethrow
}
}
}
sub inner { die "OH NOES!" }
Run Code Online (Sandbox Code Playgroud)
现在我想更改该代码,以便它执行以下操作:
为每个"冒泡"到最外层(sub outer)的异常打印一个完整的堆栈跟踪.具体来说,堆栈跟踪应该不是在"第一层次停止eval { }".
无需更改任何内部级别的实现.
现在,我这样做的方法是__DIE__在outersub中安装一个本地化的处理程序:
use Devel::StackTrace;
sub outer {
local $SIG{__DIE__} = sub { …Run Code Online (Sandbox Code Playgroud) 你知道那些打包的js文件是什么样的,对吗?
eval(function(p,a,c,k,e,d){ ... } ('obfuscated-string'.split('|'),0,{}))
它恰好是我必须调整一些看起来像这样的大型遗留代码,我想找到一种方法将其转换为更易读的版本.
如果那是不可能的,我至少可以摆脱评估吗?
是否有与Eval等效的F#?我的目的是让我的应用程序从文件中加载一个小代码示例
let file = "c:\mysample"
let sample = loadFromFile file
let results = eval(sample)
Run Code Online (Sandbox Code Playgroud)
我是F#的新手,在将其应用到项目之前尝试找出一些限制.
谢谢
我想我在Params :: Validate中遇到过一个错误,但我不确定我是否正确识别出有问题的代码.有问题的代码无法通过链传递异常(使用Try :: Tiny),所以我开始调试并发现try块内使用的类有一个析构函数.这个析构函数调用使用Params::Validate和查看Validate.pm 源代码的对象方法,我看到eval没有$@本地化,即全局$@被覆盖.
现在我看到两个选项:
Params::Validate应始终本地化$@,因此这是一个应报告的错误.Params::Validate在析构函数中使用.Params::Validate可以保持现状.哪一个?我该如何处理这种情况?
PS:我认为CPAN模块应该坚如磐石,既不会破坏自己也不会破坏环境,因此问题标题.
如果我没有弄错,eval会在给定的字符串中执行有效的代码
eval("alert('hey')");
Run Code Online (Sandbox Code Playgroud)
和
setTimeout("alert('hey')",1000);
Run Code Online (Sandbox Code Playgroud)
做同样的事情,只有一个计时器.设置超时和eval一样有风险吗?
我似乎记得,相信之后的价值是不安全$@的eval.关于信号处理程序$@在你看到它之前有机会设置的东西.我现在也太累了,懒得追查真正的原因.那么,为什么信任不安全$@呢?
我一直在读这里和其他地方的bash引用,但我没有帮助解决这个问题.
问题是,我有一个小循环进行备份的脚本.
如果我不使用eval那么我有$OPTIONS变量的问题rsync.
但是如果我确实使用eval那么问题就变成了变量$CURRENT_DIR......
rsync返回以下消息:'Unexpected local arg:/ path/with'
我已经尝试过引用变量的各种方法 $CURRENT_DIR
CURRENT_DIR="/path/with spaces/backup"
DIR="dir_by_project"
f=":/home/project_in_server"
OPTIONS="-avr --exclude 'public_html/cms/cache/**' --exclude 'public_html/cms/components/libraries/cmslib/cache/**' --delete"
eval rsync --delete-excluded -i $OPTIONS root@example.com$f $CURRENT_DIR/xxx/$DIR/files
Run Code Online (Sandbox Code Playgroud)
有没有办法可以使用变量$CURRENT_DIR而没有空格引起的问题?
我在bash脚本中嵌套引号有困难
argv="su -c '$RVM_PATH wrapper $config_rvm \'$PASSENGER_RVM_BIN $command $options\'' web"
eval $argv
Run Code Online (Sandbox Code Playgroud)
以上得到了我
eval: line 162: unexpected EOF while looking for matching `''
eval: line 163: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud) 我正在尝试为大型项目调试makefile,我正在努力define TEMPLATE/ endef和foreach/ eval/ call构造.特别是我认为我很难弄清楚我需要引用哪些变量$以及需要引用哪些变量$$.
我认为如果我可以在变量扩展之前看到eval/ callexpansion 的实际结果,我会更容易调试.
举例来说,如果我们使用的例子EVAL文档为GNU的化妆,我们有以下的makefile片段:
PROGRAMS = server client
server_OBJS = server.o server_priv.o server_access.o
server_LIBS = priv protocol
client_OBJS = client.o client_api.o client_mem.o
client_LIBS = protocol
...
define PROGRAM_template =
$(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%)
ALL_OBJS += $$($(1)_OBJS)
endef
$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog))))
Run Code Online (Sandbox Code Playgroud)
我认为foreach在变量扩展之前,这应该有效地扩展到以下内容:
server: $(server_OBJS) $(server_LIBS:%=-l%)
ALL_OBJS += $(server_OBJS)
client: $(client_OBJS) $(client_LIBS:%=-l%)
ALL_OBJS += $(client_OBJS)
Run Code Online (Sandbox Code Playgroud)
我手动想出了上面的扩展(更正欢迎),但我正在寻找一种通用的方法来展示这个扩展以获得更复杂的例子.这种方法存在吗?
我已经研究过 …
eval ×10
javascript ×3
perl ×3
bash ×2
exception ×2
.net ×1
compression ×1
debugging ×1
f# ×1
foreach ×1
lisp ×1
makefile ×1
namespaces ×1
nested ×1
quotes ×1
quoting ×1
rsync ×1
setinterval ×1
settimeout ×1
stack-trace ×1
unpack ×1