小编Jon*_*rtz的帖子

如何在emacs中定期运行任务?

有没有办法在长期运行的emacs中定期运行elisp函数,类似于cron,但是在emacs过程中?

例如,我想"每隔半小时自动运行(recentf-save-list)",因为它只会在退出时运行,这在emacs偶尔崩溃时会很糟糕.(还有其他一些例子,因此寻找一般解决方案,而不是特别针对recentf).

emacs elisp

31
推荐指数
1
解决办法
4334
查看次数

一个简单的Perl正则表达式保证永远不会匹配字符串?

可能重复:
永远不会被任何东西匹配的正则表达式

我有一个脚本,以正则表达式作为参数.默认情况下,我想将正则表达式设置为永远不会匹配任何字符串的东西,所以我可以简单地说

if ($str =~ $regex)
Run Code Online (Sandbox Code Playgroud)

没有例如必须首先检查已定义($ regex).

我想出来了

qr/[^\s\S]/
Run Code Online (Sandbox Code Playgroud)

但不知道这是否会匹配一些既不是空间也不是非空间的utf8字符.

regex perl

9
推荐指数
2
解决办法
1055
查看次数

如何规范化Perl函数参数以进行memoization?

如何规范化字符串的函数参数列表,以便两个参数列表转换为相同的字符串iff它们实际上是等效的?算法应该

  1. 比较嵌入式哈希和列表,而不是通过引用
  2. 忽略哈希键顺序
  3. 忽略3和"3"之间的差异
  4. 生成一个相对可读的字符串(不是必需的,但很适合调试)
  5. 表现良好(XS优于Perl)

这对于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)

perl

9
推荐指数
1
解决办法
738
查看次数

现代POD到HTML转换器产生像search.cpan.org的结果

是否有可用于以与search.cpan.org类似的方式将POD转换为HTML的代码?我想在我的CPAN分发模块上运行它,看看它们在发布前的外观.

Perl附带的pod2html似乎已经过时了.它有一些古怪的东西,例如在当前目录中存放临时文件以及创建像"某某手册页"这样的链接,并且输出远远低于search.cpan.org的漂亮输出.但不确定其他人在使用什么.

perl

7
推荐指数
2
解决办法
1526
查看次数

获取当前进程的perl可执行文件的绝对路径

有没有办法获得当前进程的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};
    }

perl

6
推荐指数
1
解决办法
3233
查看次数

什么应该是Perl测试(.t)脚本的第一行?

我正在查看我的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,如果总是希望从证明中调用测试.

testing perl

6
推荐指数
1
解决办法
440
查看次数

从Perl"Out of memory"错误获取堆栈跟踪

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)不知何故,进程会持续监视自己的内存,并在内存变高但"内存不足"错误之前转储堆栈跟踪.

谢谢!

乔恩

memory perl out-of-memory

5
推荐指数
1
解决办法
1706
查看次数

如何安全地从JSON 1升级到JSON 2和utf8字符串?

我们有一个庞大的代码库,可以大量使用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以与现有代码向后兼容?

perl json utf-8

5
推荐指数
1
解决办法
255
查看次数

Moose类属性,类似于Class :: Data :: Inheritable

我在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 …

perl moose

5
推荐指数
1
解决办法
261
查看次数

git reset --hard似乎忽略.git/info/exclude

我们有一个共享目录(调用它/共享),我们通过我们的主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"单独留下这个目录,除了事先将它移开并在之后恢复它?

git

4
推荐指数
2
解决办法
1827
查看次数

在Linux上提高系统范围内RLIMIT_NOFILE的硬限制

我们需要在运行memcached时引发RLIMIT_NOFILE,因为我们正在达到默认的硬限制(1024).但是,提高硬限制需要root,并且由于各种原因,我们不希望以root身份运行memcached或其包含shell.现在我们很乐意以非root用户身份运行它.

有没有办法在系统范围内提高RLIMIT_NOFILE的硬限制,以便我们可以继续以非root方式运行memcached并简单地提高软限制?

这是具有2.6内核的RedHat Linux.

谢谢!

乔恩

linux limits

2
推荐指数
1
解决办法
1万
查看次数

Emacs Shell命令输出“无法设置终端进程组”和“此Shell中没有作业控制”

当我在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

很高兴根据需要提供其他信息。谢谢!

emacs bash debian

2
推荐指数
1
解决办法
2596
查看次数

Perl中的非本地返回(从调用者返回)

有没有办法让我我的来电者返回而不是我的来电者?例如

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)

perl

1
推荐指数
1
解决办法
268
查看次数

标签 统计

perl ×9

emacs ×2

bash ×1

debian ×1

elisp ×1

git ×1

json ×1

limits ×1

linux ×1

memory ×1

moose ×1

out-of-memory ×1

regex ×1

testing ×1

utf-8 ×1