可能重复:
何时使用lambda,何时使用Proc.new?
(我知道有几次被问过,但我找不到满意的答案)有人可以解释一下Blocks,Procs和Lambdas以及为什么应该使用其他的,当一个人应该使用proc,类似和/或拉姆达.还会对计算机内存产生影响.请举例说明.
我知道应该使用Procs和lambdas的不同情况(lambda检查参数数量等),但是它们会占用不同的内存量吗?如果是这样,哪一个更有效率?
例如
x = 123
p = Proc.new {
x = 'I do not want change the value of the outer x, I want to create a local x'
}
Run Code Online (Sandbox Code Playgroud)
在Ruby中是否有与Perl中的"my"关键字相同的东西?
我试图在没有root访问权限的情况下识别端口56474上运行的应用程序.我知道应用程序是由我启动的.
例:
netstat -tunap
tcp 0 0 0.0.0.0:56474 0.0.0.0:* LISTEN -
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用/ proc/pid脚本在ls -l/proc/pid/fd结果上使用grep遍历所有内容.这是我的尝试.注意:不确定我是否朝着正确的方向前进
for I in `find /proc/*/fd -exec ls -l {} \; 2>/dev/null | awk -F"->|:" '/socket/ {print $4}' | sort -u | sed -e 's/\[//g' -e 's/\]//g'`; do grep $I /proc/*/net/tcp; done
Run Code Online (Sandbox Code Playgroud)
我没有成功.不确定是否有办法.谢谢.
我对Ruby块和触发器的理解是它们都是闭包.现在我已经看到它与instance_eval一起使用,我有点困惑.什么是魔术酱,在查看裸机时的工作量不足,与使用instance_eval相比,它改变了块在大多数常见用途下的作用范围?
以下是您可以在IRB中转储以查看我的意思的示例.我已经包含了proc.call和block yield版本示例.令人高兴的是,他们的行为都是一样的.
# Testing block/proc and eval
class Example
def initialize(value)
# value defined in the instance
@value = value
end
def call_a_proc(proc)
proc.call self
end
def yield_to_block
yield self
end
end
# Value defined in the global object
@value = 1
example = Example.new 'a'
# the block/proc that prints @value
proc1 = -> instance { puts @value }
# instance calling/yielding the block/proc that prints @value
proc2 = -> instance { instance.call_a_proc proc1 }
proc3 = -> …Run Code Online (Sandbox Code Playgroud) 如果我们在集合上有一个方法,该方法采用一个块,而在每个元素上执行了另一个方法,则可以使用&符号将其写得更短。例如:如果我们有一个整数数组,并且想要删除奇数,我们可以这样做:
[1,2,3,4,5,6,7,8].reject {|x| x.odd?}
Run Code Online (Sandbox Code Playgroud)
使用与号,我们可以这样写:
[1,2,3,4,5,6,7,8].reject(&:odd?)
Run Code Online (Sandbox Code Playgroud)
假设我们有一个字符串数组,并且想要删除包含的元素'a'。我们可以这样编写解决方案:
['abc','cba','cbc','cdc','dca','cad','dc','cc].reject {|x| x.include? 'a'}
Run Code Online (Sandbox Code Playgroud)
我们如何使用与号语法编写此代码(如果可能)?
我有以下代码
ods select Variables;
proc contents data=xmlout.&XML_DSET;
run;
Run Code Online (Sandbox Code Playgroud)
ods pdf open语句在代码中较早
ods pdf file="&exceldir\README.pdf" startpage=never;
title 'README FILE';
Run Code Online (Sandbox Code Playgroud)
这需要xmlout.&XML_DSET并且很好地将它放在pdf中(ods pdf close;稍后在代码中).
然而!
如果我把varnum按顺序放在数据集中就像变量一样存在
ods select Variables;
proc contents data=xmlout.&XML_DSET varnum;
run;
Run Code Online (Sandbox Code Playgroud)
pdf根本不显示结果!
我究竟做错了什么?
谢谢!
a_proc = Proc.new {|a,b,*c| p c; c.collect {|i| i*b }}
puts a_proc[2,2,4,3]
Run Code Online (Sandbox Code Playgroud)
根据https://ruby-doc.org/core-2.2.0/Proc.html,上面的代码非常直观,a_proc [2,2,4,3]只是a_proc.call(2,2 ,4,3)隐藏“通话”
但是以下内容(效果很好)让我很困惑
a=[2,2,4,3]
puts a_proc.call(a)
puts a_proc.call(*a)
Run Code Online (Sandbox Code Playgroud)
似乎与普通的函数调用有很大不同,因为它不检查传入的数字参数。
但是,按预期方式,如果同样使用参数,则调用语义的方法将引发错误
def foo(a,b,*c)
c.collect{|i| i*b}
end
foo([1,2,3,4]) #`block in <main>': wrong number of arguments (given 1, expected 2+) (ArgumentError)
foo(*[1,2,3,4]) #works as expected
Run Code Online (Sandbox Code Playgroud)
我不认为这种不一致是设计故障,因此,对此有任何见解将不胜感激。
我一直致力于一个使用PID /proc和命令行分析来验证系统进程的项目.我的代码必须由安全人员检查,他们设法用一条线来打破它......令人尴尬!
#!/usr/bin/env perl
$0="I am running wild"; # I had no clue you can do this!
system("cat /proc/$$/cmdline");
print("\n");
system("ps -ef | grep $$");
# do bad stuff here...
Run Code Online (Sandbox Code Playgroud)
我的问题:
我看到了上面的一些用例,比如隐藏在命令行上给出的密码(也是不好的做法)但是当我可以隐藏进程和欺骗时,我会看到更多的问题/问题cmdline.它有被允许的原因吗?这不是一个系统漏洞吗?
我该如何预防或发现这个?我已经研究了/procmount选项.我也知道可以使用lsof基于意外行为识别欺骗过程,但这在我的情况下不起作用.目前我正在使用一个简单的方法来检测是否cmdline包含至少一个null(\0)字符,该字符假定至少存在一个参数.在上面的代码中,空格需要用空值替换以绕过该检查,这是我无法在perl中找到的方法 - 写入第一个\0.
谢谢
我想导出一个由PROC TABULATE. 我的代码是这样的:
ODS EXCEL FILE="myFile.xlsx" (options sheet_name="CRIME TYPE");
PROC TABULATE DATA=myData;
TITLE 'myTitle';
BY crime_type;
CLASS year;
CLASS nation / ORDER=FREQ;
TABLES year, nationality / CONDENSE;
RUN;
ODS EXCEL CLOSE;
Run Code Online (Sandbox Code Playgroud)
这为我创建了一个包含不同工作表的 excel 文件:
THEFT
country1 country2 country3 ...
--------------------------------------
1990
1991
1992
--------------------------------------
ASSAULT
country1 country2 country3 ...
--------------------------------------
1990
1991
1992
--------------------------------------
Run Code Online (Sandbox Code Playgroud)
不幸的是,这些表没有不同罪行(盗窃、袭击等)的名称,而是被称为“犯罪类型 1”、“犯罪类型 2”等等(SHEET_NAME="CRIME TYPE")。
有谁知道如何根据变量的值命名工作表crime_type?