有没有办法在长期运行的emacs中定期运行elisp函数,类似于cron,但是在emacs过程中?
例如,我想"每隔半小时自动运行(recentf-save-list)",因为它只会在退出时运行,这在emacs偶尔崩溃时会很糟糕.(还有其他一些例子,因此寻找一般解决方案,而不是特别针对recentf).
可能重复:
永远不会被任何东西匹配的正则表达式
我有一个脚本,以正则表达式作为参数.默认情况下,我想将正则表达式设置为永远不会匹配任何字符串的东西,所以我可以简单地说
if ($str =~ $regex)
Run Code Online (Sandbox Code Playgroud)
没有例如必须首先检查已定义($ regex).
我想出来了
qr/[^\s\S]/
Run Code Online (Sandbox Code Playgroud)
但不知道这是否会匹配一些既不是空间也不是非空间的utf8字符.
如何规范化字符串的函数参数列表,以便两个参数列表转换为相同的字符串iff它们实际上是等效的?算法应该
这对于memoization是必要的,即根据其参数缓存函数的结果.
作为一个稻草人的例子,Memoize使用它作为默认的规范化器,它失败了#1和#3:
$argstr = join chr(28),@_;
Run Code Online (Sandbox Code Playgroud)
有一段时间,我的首选标准化程序是
JSON::XS->new->utf8->canonical
Run Code Online (Sandbox Code Playgroud)
然而,它根据最近如何使用标量来区别对待数字3和字符串"3" .这可以为基本等效的参数列表生成不同的字符串,并降低memoization的好处.(绝大多数功能都不知道或不关心他们是3还是"3".)
为了好玩,我查看了一堆序列化程序,看看哪些区分3和"3":
Data::Dump : equal - [3] vs [3]
Data::Dumper : not equal - [3] vs ['3']
FreezeThaw : equal - FrT;@1|@1|$1|3 vs FrT;@1|@1|$1|3
JSON::PP : not equal - [3] vs ["3"]
JSON::XS : not equal - [3] vs ["3"]
Storable : not equal - <unprintable>
YAML : equal - ---\n- 3\n vs ---\n- 3\n
YAML::Syck : equal - …Run Code Online (Sandbox Code Playgroud) 是否有可用于以与search.cpan.org类似的方式将POD转换为HTML的代码?我想在我的CPAN分发模块上运行它,看看它们在发布前的外观.
Perl附带的pod2html似乎已经过时了.它有一些古怪的东西,例如在当前目录中存放临时文件以及创建像"某某手册页"这样的链接,并且输出远远低于search.cpan.org的漂亮输出.但不确定其他人在使用什么.
有没有办法获得当前进程的Perl可执行文件的绝对路径?
$ ^ X将为我提供Perl可执行文件名,但是文档声明它有时会是一个相对路径,例如在OS X上这似乎是正确的.
ExtUtils :: MakeMaker似乎有一些神奇的东西可以找到绝对路径,因为它在我的OS X上生成的Makefile包含
PERL = /usr/local/bin/perl
FULLPERL = /usr/local/bin/perl
Run Code Online (Sandbox Code Playgroud)
但我不知道它是如何做到的,或者其他人是否可以轻易获得魔法.
编辑:谢谢鲍罗丁的$Config{perlpath}提示.在ExtUtils中对此进行了解释,我在ExtUtils :: MM_Unix :: _ fixin_replace_shebang中找到了这个小窍门,我猜这是MakeMaker使用正确的shebang代替#!perl的内容.
if ( $Config{startperl} =~ m,^\#!.*/perl, ) {
$interpreter = $Config{startperl};
$interpreter =~ s,^\#!,,;
}
else {
$interpreter = $Config{perlpath};
}
我正在查看我的CPAN发行版,并意识到我在.t脚本的顶部有各种不一致的东西,基于我从哪里进行货物定制.这当然冒犯了我.
那么,Perl测试(.t)脚本的"最佳"第一行是什么?对我的.cpanm消息来源进行的非科学调查显示:
3429 use strict;
3211 #!/usr/bin/perl
1344 #!/usr/bin/env perl
937 #!perl
909 #!/usr/bin/perl -w
801 #!perl -w
596
539 #!perl -T
Run Code Online (Sandbox Code Playgroud)
与我应该用于Perl脚本的shebang线有什么关系?,但在这里我想知道是否有必要/有用的shebang,如果总是希望从证明中调用测试.
tl; dr:当Perl httpd进程耗尽内存时,如何转储perl堆栈跟踪.
我们有一个mod_perl 2服务器,Perl 5.8.8,RHEL 5.6,Linux 2.6.18.
偶然且不可预测的是,子httpd进程开始以惊人的速度耗尽所有可用内存.我们至少使用过BSD :: Resource :: setrlimit(RLIMIT_VMEM,...),因此在关闭服务器之前,进程会因"Out of memory"而死亡.
我们不知道代码在哪里发生,并且很难在没有数小时负载测试的情况下重现.
我们真正喜欢的是在进程耗尽内存之前获取Perl堆栈跟踪的方法,因此我们知道导致此问题的代码.不幸的是,"内存不足"是一个无法解决的错误.
以下是我正在考虑的选项,每个选项都有其缺点:
1)使用$ ^ M紧急内存池.需要我们使用-DPERL_EMERGENCY_SBRK和-Dusemymalloc重新编译perl.
2)放入大量日志语句,然后分析日志以查看进程停止的位置.
3)编写一个不断扫描httpd进程池的外部脚本,如果它看到一个使用大量内存的脚本,则向它发送一个USR2信号(我们已安排转储堆栈跟踪).
4)不知何故,进程会持续监视自己的内存,并在内存变高但"内存不足"错误之前转储堆栈跟踪.
谢谢!
乔恩
我们有一个庞大的代码库,可以大量使用JSON v1 API:
use JSON;
my $json = objToJson($data);
my $data = jsonToObj($json);
Run Code Online (Sandbox Code Playgroud)
我们想升级到JSON v2,因此我们可以在新代码中开始使用它,因为我们遇到了依赖于v2 API的其他模块.
但是,如果我已经存储了由其创建的utf8字符串objToJson(),则JSON :: XS将不会再以相同的方式对其进行解码(这是JSON v2在幕后使用的).
use JSON;
use JSON::XS;
use warnings;
use strict;
my $data = ["\x{263a}b"];
my $encoded = JSON::objToJson($data);
print "different!\n"
unless JSON::jsonToObj($encoded)->[0] eq JSON::XS::decode_json($encoded)->[0];
print "different!\n"
unless JSON::jsonToObj($encoded)->[0] eq JSON::XS->new->decode($encoded)->[0];
Run Code Online (Sandbox Code Playgroud)
我们有什么方法可以升级到JSON v2,但仍然保留v1 API以与现有代码向后兼容?
我在Moose类中有一个class属性,但是我希望它可以像覆盖父值的子类一样工作,就像Class :: Data :: Inheritable一样.也就是说,子类继承父级的值,直到在子类上调用setter,此时值变为不同.例如
#!/usr/bin/perl
use warnings;
use strict;
{
package Foo;
use Moose;
use MooseX::ClassAttribute;
class_has Item => ( is => 'rw' );
}
{
package Bar;
use Moose;
extends 'Foo';
}
Foo->Item(4);
# This prints "4, 4" as expected
#
print join( ", ", Foo->Item(), Bar->Item() ) . "\n";
Bar->Item(5);
# Would like this to print "4, 5", but it prints "5, 5"
#
print join( ", ", Foo->Item(), Bar->Item() ) . "\n";
Run Code Online (Sandbox Code Playgroud)
使用MooseX …
我们有一个共享目录(调用它/共享),我们通过我们的主git分支自动更新,只要有一个push to master就运行这些命令:
git reset --hard HEAD git clean -f -d git pull
这在很大程度上起作用.然而,即使在git中检查了"media"符号链接,我们也不希望触及目录/共享/媒体.
我已将"media"添加到.git/info/exclude中,但无论如何,"git reset --hard HEAD"会删除/ shared/media并将其替换为已签入的符号链接.
有没有办法让"git reset --hard HEAD"单独留下这个目录,除了事先将它移开并在之后恢复它?
我们需要在运行memcached时引发RLIMIT_NOFILE,因为我们正在达到默认的硬限制(1024).但是,提高硬限制需要root,并且由于各种原因,我们不希望以root身份运行memcached或其包含shell.现在我们很乐意以非root用户身份运行它.
有没有办法在系统范围内提高RLIMIT_NOFILE的硬限制,以便我们可以继续以非root方式运行memcached并简单地提高软限制?
这是具有2.6内核的RedHat Linux.
谢谢!
乔恩
当我在Debian 6.0(Squeeze)上的Emacs中运行shell命令时,例如
(shell-command "ls")
Run Code Online (Sandbox Code Playgroud)
输出之前
bash:无法设置终端进程组(-1):无效的参数 bash:此shell中无作业控制
当将shell命令(例如perltidy)应用于缓冲区时,这尤其令人讨厌,因为这些行最终位于缓冲区的顶部。
这是一个新安装的Debian 6.0(Squeeze)系统,带有来自apt-get的最新emacs。
%uname -a Linux 2.6.32-5-xen-amd64#1 SMP Tue Mar 8 00:01:30 UTC 2011 x86_64 GNU / Linux %emacs-版本 GNU Emacs 23.2.1 %dpkg -l | grep emacs ii emacs 23.2 + 1-7 ii emacs23 23.2 + 1-7 ii emacs23-bin-common 23.2 + 1-7 ii emacs23-common 23.2 + 1-7 ii emacsen常见的1.4.22
很高兴根据需要提供其他信息。谢谢!
有没有办法让我从我的来电者返回而不是给我的来电者?例如
sub foo {
bar();
# this never gets executed
}
sub bar {
return_from_caller(5);
}
# This prints 5
print foo();
Run Code Online (Sandbox Code Playgroud)
(理由:我正在编写一个函数memoize_self,它在函数本身内记忆一个函数.我希望它能像这样工作:
sub complex_function {
my ($x, $y) = @_;
memoize_self({key => $y, expires_in => '5min'));
# compute $result
return $result;
}
Run Code Online (Sandbox Code Playgroud)
memoize_self将检查自己的缓存,如果它得到一击,返回缓存值从它的调用者.否则,它将重新调用该函数(使用动态范围的var来避免明显的无限循环),将返回值存储在缓存中并再次返回它.
如果没有从调用者返回的能力,我可能会使用$ _并以这种方式编写它:
return $_ if memoize_self({key => $y, expires_in => '5min'));
Run Code Online (Sandbox Code Playgroud)
但这是额外的噪音,也没有考虑上下文.)
编辑:对合理建议Memoize的人 - 是的,我应该说,我很了解这个模块.我正在编写一个基于CHI的更现代和功能更强的Memoize版本.
但作为涉及到这个问题,有些情况下是非常有用的,以memoize的案件中的作用,而不是外界的功能(memoize的只做后者).它可以轻松自定义缓存键和/或确定是否要为此特定调用进行任何记忆.例如
sub complex_function {
my $key = ...; …Run Code Online (Sandbox Code Playgroud)