小编Sch*_*ern的帖子

在C中编写可移植的命令行包装器

我正在编写一个名为perl5i的perl模块.它的目标是在一个模块中修复一大堆常见的Perl问题(使用许多其他模块).

要在命令行上为一个内容调用它,你会写:perl -Mperl5i -e 'say "Hello"' 我认为这太冗长,所以我想提供一个perl5i包装器,这样你就可以写了perl5i -e 'say "Hello"'.我也希望人们能够编写脚本,#!/usr/bin/perl5i因此它必须是一个已编译的C程序.

我想我所要做的就是将"-Mperl5i"推到参数列表的前面并调用perl.这就是我尝试过的.

#include <unistd.h>
#include <stdlib.h>

/*
 * Meant to mimic the shell command
 *     exec perl -Mperl5i "$@"
 *
 * This is a C program so it works in a #! line.
 */

int main (int argc, char* argv[]) {
    int i;
    /* This value is set by a program which generates this C file */
    const char* perl_cmd = "/usr/local/perl/5.10.0/bin/perl";
    char* perl_args[argc+1]; …
Run Code Online (Sandbox Code Playgroud)

c windows perl command-line

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

在Perl中,如何向操作系统释放内存?

我在Perl中遇到了一些内存问题.当我填满一个大哈希时,我无法将内存释放回操作系统.当我使用标量和使用时undef,它会将内存返回给操作系统.

这是我写的测试程序.

#!/usr/bin/perl
###### Memory test
######

## Use Commands
use Number::Bytes::Human qw(format_bytes);
use Data::Dumper;
use Devel::Size qw(size total_size);

## Create Varable
my $share_var;
my %share_hash;
my $type_hash = 1;
my $type_scalar = 1;

## Start Main Loop
while (true) {
    &Memory_Check();
    print "Hit Enter (add to memory): "; <>;
    &Up_Mem(100_000);
    &Memory_Check();

    print "Hit Enter (Set Varable to nothing): "; <>;
    $share_var = "";
    $share_hash = ();
    &Memory_Check();

    print "Hit Enter (clean data): "; <>;
    &Clean_Data();
    &Memory_Check();

    print …
Run Code Online (Sandbox Code Playgroud)

perl memory-management

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

过滤存储库时如何保留标记?

有没有办法以自动方式将存储库及其所有标记移动到另一个存储库的子目录中?

出于原因,项目被拆分为多个存储库.现在我们看到这不是一个热门的想法,并希望再次将它重新组合在一起.考虑了子模块,但它们实际上是一个项目,我们需要在它们之间移动大量文件.

假设我们有存储库A,B和C.我们想要一个项目,每个项目都作为子目录:

project/
    A/
    B/
    C/
Run Code Online (Sandbox Code Playgroud)

这可以通过以下方式实现git-filter-branch --tree-filter.做完了,没问题.它甚至也正确地分支,这是一个令人愉快的惊喜.

麻烦的是,A,B和C都有标签,它们都需要转换.

这可以自动化吗?

git git-filter-branch

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

如何修复缺少对象的git存储库?

我的开发存储库在某些时候丢失了一个对象.

$ git fsck
fatal: failed to read object 2dddc84156fa30e4614a7ea5a1895885011b8db8: Invalid argument
$ git cat-file -t 2dddc84156fa30e4614a7ea5a1895885011b8db8
error: unable to find 2dddc84156fa30e4614a7ea5a1895885011b8db8
fatal: git cat-file 2dddc84156fa30e4614a7ea5a1895885011b8db8: bad file
Run Code Online (Sandbox Code Playgroud)

新近克隆的存储库具有该对象.

$ git cat-file -t 2dddc84156fa30e4614a7ea5a1895885011b8db8
tree
Run Code Online (Sandbox Code Playgroud)

我想保留我的开发存储库,它已经拆除了分支和存储.

如何将该对象修补到我破损的存储库中?

git

12
推荐指数
3
解决办法
9130
查看次数

是否有一个很好的理由很多网站都不接受带有空格和破折号的信用卡?

是否有技术/法律/财务/合同/设计理由不接受带有空格的信用卡号码?

如此多的网站不允许您在信用卡号码中放置空格或破折号.我总是把这些放到草率的编程中,但之前我曾经使用过商业API.如果您可以弄清楚如何处理信用卡,您可以弄清楚如何从字符串中删除字符.设计师知道他们因为他们在网站上发出警告而引起了用户的挫败感.他们就在卡片上!甚至还有一道耻辱之墙.

虚假的懒惰,错误的编程,冷酷无情,虐待狂......所有这些都假设在做代码的人中最糟糕的.我能想到的最慷慨的是他们对涉及金钱的任何东西都非常保守.我一直想知道为什么你不应该接受带有空格的信用卡号码有一些深层次和真正重要的原因?为什么你绝对不应该尝试应用任何启发式方法.也许可以追溯到电报时代的一些奇怪的金融法?也许他们是无名英雄,保护我们免受某些未知的邪恶,以免我们输入Hastur的信用卡号码三次.

validation payment credit-card

11
推荐指数
2
解决办法
564
查看次数

在Moose中,如何使用一个方法调用设置多个默认值?

我有两个对象属性需要昂贵的计算,所以我希望它们是懒惰的.它们最有效地一起计算,所以我想同时计算它们.穆斯是否提供了这样做的方法?

我想要的是"默认"或"构建器",但不是返回默认值,而是直接设置属性.返回值将被忽略.

has max_things =>
    is      => 'rw',
    isa     => 'Int',
    lazy    => 1,
    xxxxx   => '_set_maxes';

has max_pairs =>
    is      => 'rw',
    isa     => 'Int',
    lazy    => 1,
    xxxxx   => '_set_maxes';

# Let's just assume this is an expensive calculation or the max_*
# attributes are used rarely and a lot of objects are created.
sub _set_maxes {
    my $self = shift;

    if( $self->is_32_bit ) {
        $self->max_things(2**31);
        $self->max_pairs(12345 * 2);
    }
    else {
        $self->max_thing(2**63);
        $self->max_pairs(23456 * 2);
    }

    return; …
Run Code Online (Sandbox Code Playgroud)

perl moose

10
推荐指数
2
解决办法
401
查看次数

如何在不将文件存储在内存中的情况下从文件中读取N个随机行?

我熟悉从文件读取单个随机行而不将整个文件读入内存的算法.我想知道这种技术是否可以扩展到N个随机线?

用例是一个密码生成器,它连接从字典文件中拉出的N个随机字,每行一个字(如/usr/share/dict/words).你可能想出来angela.ham.lewis.pathos.现在它将整个字典文件读入一个数组,并从该数组中选择N个随机元素.我想消除该文件的数组或任何其他内存存储,并只读取该文件一次.

(不,这不是一个实际的优化练习.我对算法感兴趣.)

更新:谢谢大家的答案.

答案分为三类:完整读取算法的修改,随机搜索或索引线并随机搜索它们.

随机搜索要快得多,并且相对于文件大小是恒定的,但是基于文件大小而不是字数来分发.它还允许重复(可以避免,但它使算法O(inf)).这是我使用该算法重新实现我的密码生成器.我意识到,通过从搜索点向前读取,而不是向后读取,如果搜索落在最后一行,它会有一个一个一个错误.校正留作编辑的练习.

#!/usr/bin/perl -lw

my $Words       = "/usr/share/dict/words";
my $Max_Length  = 8;
my $Num_Words   = 4;

my $size = -s $Words;

my @words;
open my $fh, "<", $Words or die $!;

for(1..$Num_Words) {
    seek $fh, int rand $size, 0 or die $!;
    <$fh>;
    my $word = <$fh>;
    chomp $word;
    redo if length $word > $Max_Length;
    push @words, $word;
}
print join ".", @words;
Run Code Online (Sandbox Code Playgroud)

然后就是Guffa的答案,这正是我所寻找的; 原始算法的扩展.更慢,它必须读取整个文件,但是按字分发,允许过滤而不改变算法的效率,并且(我认为)没有重复.

#!/usr/bin/perl -lw

my $Words …
Run Code Online (Sandbox Code Playgroud)

random algorithm

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

如何找到当前运行的PHP可执行文件?

从PHP程序内部我想知道执行它的二进制文件的位置.Perl就是$^X为了这个目的.PHP中是否有相同的东西?

这样它可以使用自己执行子PHP进程(而不是硬编码路径或假设"php"是正确的).

UPDATE

  1. 我使用的是lighttpd + FastCGI,而不是Apache + mod_php.所以是的,有一个PHP二进制文件.
  2. eval/include不是解决方案,因为我正在生成一个必须在请求之外生存的服务器.

我尝试过但不起作用的事情:

  • $_SERVER['_']看起来像我想要的命令行,但它实际上来自上一个执行程序的shell设置的环境变量.从Web服务器运行时,这是Web服务器二进制文件.
  • which php将无法正常工作,因为不保证PHP二进制文件与Web服务器中的二进制文件相同PATH.

提前致谢.

php fastcgi

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

有没有办法转储C结构?

我编写了一个程序来探测系统的C time.h函数的限制,并将它们转储到JSON中.那么依赖于这些功能的其他东西可以知道它们的极限.

# system time.h limits, as JSON
{
    "gmtime": { "max": 2147483647, "min": -2147483648 },
    "localtime": { "max": 2147483647, "min": -2147483648 },
    "mktime": {
        "max": { "tm_sec": 7, "tm_min": 14, "tm_hour": 19, "tm_mday": 18, "tm_mon": 0, "tm_year": 138, "tm_wday": 1, "tm_yday": 17, "tm_isdst": 0 },
        "min": { "tm_sec": 52, "tm_min": 45, "tm_hour": 12, "tm_mday": 13, "tm_mon": 11, "tm_year": 1, "tm_wday": 5, "tm_yday": 346, "tm_isdst": 0 }
    }
}
Run Code Online (Sandbox Code Playgroud)

gmtime()和localtime()很简单,只需要数字,但mktime()需要一个tm结构.我编写了一个自定义函数来将tm结构转换为JSON哈希.

/* Dump a tm struct as a json fragment */ …
Run Code Online (Sandbox Code Playgroud)

c json struct

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

perl内置的函数是原子的吗?

我正在写一些线程代码,我想知道Perl内置的函数和运算符是原子的,可以安全地使用共享变量而不需要锁定.例如,有人告诉我++,--,+=等等是不是因为他们是作为两个操作来实现.

某个地方有名单吗?特别地是push,pop,shift,unshiftsplice一个共享的阵列原子上?

谢谢.

perl multithreading

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