下面的Perl包装器并行执行命令,将STDOUT和STDERR保存到/ tmp文件:
open(A,"|parallel");
for $i ("date", "ls", "pwd", "factor 17") {
print A "$i 1> '/tmp/$i.out' 2> '/tmp/$i.err'\n";
}
close(A);
Run Code Online (Sandbox Code Playgroud)
如何从各个命令获取退出状态值?
什么是Perl相当于pyephem?
由于pyephem基于C库(?),我猜猜有人也创建了Perl版本?
"排序"正确报告这两行是乱序的:
> echo "a b\na a" | sort -c
sort: -:2: disorder: a a
Run Code Online (Sandbox Code Playgroud)
如何判断排序只比较每行的第一个字段?我试过了:
> echo "a b\na a" | sort -c -k1
sort: -:2: disorder: a a
Run Code Online (Sandbox Code Playgroud)
但它失败了,如上所述.
我可以对每行的第一个字段进行排序比较,还是在比较它们之前我是否必须使用像sed之类的东西修剪线条?
编辑:我正在使用"sort(GNU coreutils)7.2".我尝试使用不同的字段分隔符,但它没有帮助:
> echo "a b\na a" | sort -k1 -c -t" "
sort: -:2: disorder: a a
Run Code Online (Sandbox Code Playgroud)
虽然我很确定空间是默认的分隔符.
我正在尝试使用Maxima-fy我的Mathematica盒子选项公式(https://github.com/barrycarter/bcapps/blob/master/box-option-value.m),但是Maxima在一个相当简单的集成上崩溃了:
load(distrib);
pdflp(x, p0, v, p1, p2, t1, t2) := pdf_normal(x,log(p0),sqrt(t1)*v);
cdfmaxlp(x, p0, v, p1, p2, t1, t2) := 1-erf(x/(v*sqrt(t2-t1)/sqrt(2)));
upandin(p0, v, p1, p2, t1, t2) :=
integrate(
float(
pdflp(x, p0, v, p1, p2, t1, t2)*
cdfmaxlp(log(p1)-x, p0, v, p1, p2, t1, t2)
),
x, minf, log(p1));
Run Code Online (Sandbox Code Playgroud)
评估upandin w /某些值崩溃:
upandin(1, .15, 1.01, 1.02, 1/365.2425, 2/365.2425);
rat: replaced -.00995033085316809 by -603/60601 = -.00995033085262619
rat: replaced 2.718281828459045 by 23225/8544 = 2.718281835205993
rat: replaced 8116.5 by 16233/2 = 8116.5
rat: replaced 2.718281828459045 …Run Code Online (Sandbox Code Playgroud) 如果我将Mathematica作为"math foo bar"运行,那么什么变量可以保持foo和bar?我猜它是$ Something,但还没有找到它.
谷歌搜索告诉我Mathematica接受命令行选项,如-pwpath,-pwfile,但我找不到实际命令行参数(不是选项)的正确搜索短语.
在Perl中使用exec()时:
请注意,它
exec不会调用您的END块,也不会调用DESTROY对象上的方法.
无论如何我如何强制perl拨打电话END?我可以做类似的END(); exec($0)事情吗?
我真的想让程序结束它的当前实例并启动一个全新的实例,而且我懒得正确地执行此操作(使用cron或将整个程序置于无限循环中).但是,我的END子程序清理临时文件和其他重要的东西,所以我需要它们在执行之间运行.
无益的代码链接:
https://github.com/barrycarter/bcapps/blob/master/bc-metar-db.pl
https://github.com/barrycarter/bcapps/blob/master/bc-voronoi-temperature.pl
https://github.com/barrycarter/bcapps/blob/master/bc-delaunay-temperature.pl
当我做'ps -auxwww'时,它显示X使用大约342M的内存.
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
[...]
root 2009 1.0 5.1 342564 105012 tty7 Rs+ Oct08 469:24 X :0
[...]
Run Code Online (Sandbox Code Playgroud)
然而,'top'显示大约1358M:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
[...]
2009 root 20 0 1358m 102m 14m S 0.3 5.1 469:24.27 X
[...]
Run Code Online (Sandbox Code Playgroud)
为什么,哪一个是正确的?
我已经看到帖子重新'上'和'ps'"使用的总内存"不同(因为共享内存),但不是为什么会在单个进程上发生这种情况.
编辑:事实证明,即使没有"ps -eo"选项也会给出top给出的东西.
$all="{this, {is, some, {deeply, nested}, text}, for, you}";
while ($all=~s/{([^{}]*?)}/f($1)/seg) {}
sub f {return \{split(",",$_[0])};}
print @{$all};
Run Code Online (Sandbox Code Playgroud)
我希望$ all是一个listref,其列表包含:
{this, [reference to array], for, you}
Run Code Online (Sandbox Code Playgroud)
相反,@ {$ all}是空的.
我确信这是基本的,但我做错了什么?
注意:我有意"高举"代码在这里发布(即显示问题的最小代码).更广泛的版本是:https://github.com/barrycarter/bcapps/blob/master/playground.pl
编辑:感谢所有回答的人!笔记:
真正的f()有副作用,更新dbs等,所以我真的必须调用它.它不仅仅是将列表更改为其他内容.我不好意思没有提到这一点.
我从Mathematica导出所以"{a,b,c}"是一个列表,而不是哈希.再次,mea culpa没有提到这一点.
我知道执行此操作的"正常"方式是递归的:处理每个元素,如果元素是列表,则在列表本身上调用f().我试图"展开"递归以避免拆分嵌套的"{".如果你在里面工作,你就不必在解析时计算"{".
一个有趣的其他应用程序将是一个单行的XML解析器(差不多).
给geekosaur一个复选标记,指出哪里出错了,为什么我的方法可能是错误的.
我想我会尝试解析器方法,甚至是jrey的s/{/ [方法.
如果我'打开(A,"proc |")',即使'proc'没有写完到stdout,我如何让'close(A)'立即返回?
"man perlfunc"告诉我:
过早地关闭管道的读取端(即在另一端写入它的过程关闭它之前)将导致SIGPIPE被传递给写入器.如果另一端无法处理,请务必在关闭管道之前读取所有数据.
但有解决方法吗?具体例子:
$|=1;
open(A,"curl -sN http://test.barrycarter.info/bc-slow-cgi.pl|");
while (<A>) {
print "THUNK: $_\n";
if (/5$/) {last;}
}
print "LOOP EXIT\n";
close(A);
print "A CLOSED\n";
Run Code Online (Sandbox Code Playgroud)
bc-slow-cgi.pl只是每秒打印一次time():上面的代码打印"LOOP EXIT",但从不"A CLOSED".
当我运行这个Perl脚本时:
#!/bin/perl
use XML::Bare;
$ob = new XML::Bare(text=>'<xml><name>Bob</name></xml>');
for $i (keys %{$ob->{xml}}) {print "KEY: $i\n";}
Run Code Online (Sandbox Code Playgroud)
我没有输出.但是,如果我放入$ob一个my():
#!/bin/perl
use XML::Bare;
my($ob) = new XML::Bare(text=>'<xml><name>Bob</name></xml>');
for $i (keys %{$ob->{xml}}) {print "KEY: $i\n";}
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
KEY: _z
KEY: _i
KEY: xml
KEY: _pos
Run Code Online (Sandbox Code Playgroud)
为什么会my()如此彻底地改变这种行为,特别是考虑到我处于最高级别my()应该没有任何影响?