小编Cha*_*ens的帖子

如何告诉CPAN.pm在特定目录中安装所有模块?

我已经设定

makepl_arg         [INSTALLDIRS=site PREFIX=~/perl]
mbuildpl_arg       [--install_base ~/perl]
Run Code Online (Sandbox Code Playgroud)

在CPAN.pm配置中.我曾希望这会导致模块安装在同一个地方,但我仍然需要在PERL5LIB中设置多个路径:

export PERL5LIB=~/perl/share/perl/5.10.0:~/perl/lib/perl5/:~/perl/lib/perl/5.10.0
Run Code Online (Sandbox Code Playgroud)

这种情况已经存在了很长时间,我刚刚和它一起生活,但我想知道是否有人知道如何让CPAN.pm将所有模块放在同一目录中?

perl cpan

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

正则表达式以检测字符串中的重复

是否可以使用正则表达式检测重复的数字模式?

因此,例如,如果我有以下字符串"034503450345",是否可以匹配重复序列0345?我有一种感觉,这超出了正则表达式的范围,但我想我还是会问这里,看看我是否错过了什么.

c# regex

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

Perl 5中的哈希随机化

当Perl 5.8.1问世时,它添加了散列随机化.当Perl 5.8.2出来时,我想,除非存在环境变量(PERL_HASH_SEED),否则它会删除哈希随机化.现在好像我被严重误认为

PERL_HASH_SEED=$SEED perl -MData::Dumper -e 'print Dumper{map{$_,1}"a".."z"}'
Run Code Online (Sandbox Code Playgroud)

无论价值如何,始终都会重新启动相同的密钥排序$SEED.

哈希随机化完全消失了,我做错了什么,或者这是一个错误?

random perl hash

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

如何使Perl 6成为Unicode数据的往返安全?

对于Unicode而言,天真的Perl 6程序不是往返安全的.它似乎在内部使用标准化表格组合(NFC)作为Str类型:

$ perl -CO -E 'say "e\x{301}"' | perl6 -ne '.say' | perl -CI -ne 'printf "U+%04x\n", ord for split //'
U+00e9
U+000a
Run Code Online (Sandbox Code Playgroud)

通过文档,我无法看到任何关于这种行为,我发现它非常令人震惊.我不敢相信你必须回到字节级别来往返文本:

$ perl -CO -E 'say "e\x{301}"' | perl6 -e 'while (my $byte = $*IN.read(1)) { $*OUT.write($byte) }' | perl -CI -ne 'printf "U+%04x\n", ord for split //'
U+0065
U+0301
U+000a
Run Code Online (Sandbox Code Playgroud)

是否所有文本文件都必须在NFC中才能安全地使用Perl 6进行往返?如果该文件应该在NFD中怎么办?我必须在这里遗漏一些东西.我不敢相信这是故意的行为.

unicode perl6

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

将pseduo随机数约束到较小范围的正确方法是什么?

将PRNG的值约束到较小范围的最佳方法是什么?如果使用模数,则旧的最大数字不能被新的最大数字整除,而是偏向0通过(old_max - new_max - 1).我认为最好的方法是这样的(这是浮点数,而不是整数数学)

random_num = PRNG() / max_orginal_range * max_smaller_range
Run Code Online (Sandbox Code Playgroud)

但是我的直觉中有些东西让我质疑那种方法(可能是浮点实现和表示差异?).

随机数生成器将在硬件和软件平台上产生一致的结果,并且约束也需要.

我有理由怀疑上面的伪代码(但不是出于我的想法).MichaelGG的回答让我以不同的方式思考问题.我可以使用较小的数字对其进行建模并测试每个结果.所以,我们假设我们有一个PRNG产生0到31之间的随机数,你希望较小的范围是0到9.如果你使用模数你偏向0,1,2和3.如果你使用伪代码在你偏向0,2,5和7之上.我认为没有一种方法可以将一组映射到另一组.到目前为止,我提出的最好的方法是重新生成大于old_max/new_max,但也存在深层问题的随机数(减少周期,生成新数字的时间,直到一个在正确的范围内,等等).

我想我可能会天真地接近这个问题.可能是时候开始对文献进行一些认真的研究了(有人必须先解决这个问题).

language-agnostic random

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

当我尝试将reptition赋值运算符与数组一起使用时,为什么会出现错误?

#!/usr/bin/perl

use strict;
use warnings;

my @a = qw/a b c/;
(@a) x= 3;
print join(", ", @a), "\n";
Run Code Online (Sandbox Code Playgroud)

我希望上面的代码可以打印"a, b, c, a, b, c, a, b, c\n",但它会消失:

Can't modify private array in repeat (x) at z.pl line 7, near "3;"
Run Code Online (Sandbox Code Playgroud)

这看起来很奇怪,因为它X <op>= Y被记录为等同于X = X <op> Y,并且以下代码按照我的预期工作:

#!/usr/bin/perl

use strict;
use warnings;

my @a = qw/a b c/;
(@a) = (@a) x 3;
print join(", ", @a), "\n";
Run Code Online (Sandbox Code Playgroud)

这是Perl中的错误还是我误解了这里应该发生什么?

perl

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

当子进程触摸变量元数据时,如何防止内存爆炸?

Linux使用COW在分叉后保持较低的内存使用率,但Perl 5变量的工作方式perl似乎打败了这种优化.例如,对于变量:

my $s = "1";
Run Code Online (Sandbox Code Playgroud)

perl 真的存储:

SV = PV(0x100801068) at 0x1008272e8
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0x100201d50 "1"\0
  CUR = 1
  LEN = 16
Run Code Online (Sandbox Code Playgroud)

在数字上下文中使用该字符串时,它会修改struct表示数据的C :

SV = PVIV(0x100821610) at 0x1008272e8
  REFCNT = 1
  FLAGS = (IOK,POK,pIOK,pPOK)
  IV = 1
  PV = 0x100201d50 "1"\0
  CUR = 1
  LEN = 16
Run Code Online (Sandbox Code Playgroud)

字符串指针本身没有改变(它仍然是0x100201d50),但现在它处于不同的C struct(PVIV而不是a PV).我根本没有修改价值,但突然间我付了COW费用.有没有办法锁定perlPerl 5变量的表示,以便节省时间(perl不必转换"0"0第二次)hack不会损害我的内存使用?

注意,上面的表示是从这段代码生成的: …

linux perl performance memory-management

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

为什么输入不能修改ng-repeat(和ng-switch)之外的值?

我假设范围问题是这个例子中的输入可以修改它旁边的值而不是其他值的原因.如果是这种情况,我如何将模型连接到正确的范围?如果不是范围问题,我做错了什么?

<html ng-app>
    <head>
        <script type="text/javascript" src="angular-1.0.1.min.js"></script>
        <script type="text/javascript">
            function ExampleCtrl($scope) {
                $scope.list = [
                    { name: "a" },
                    { name: "b" },
                ];

                $scope.value = 5;
            }
        </script>
    </head>
    <body ng-controller="ExampleCtrl">
        <ul ng-repeat="item in list">
            <li>{{ item.name }}
                <ng-switch on="item.name">
                    <span ng-switch-when="b">
                        <input type="number" ng-model="value" />
                        {{ value }}
                    </span>
                </ng-switch>
            </li>
        </ul>

        value is {{ value }}
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

angularjs

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

如何在html/template中执行操作后控制空格?

我有一个控制空白的问题,仍然html/template以可读的方式格式化模板.我的模板看起来像这样:

layout.tmpl

{{define "layout"}}
<!DOCTYPE html>
<html>
        <head>
                <title>{{.title}}</title>
        </head>
        <body>
                {{ template "body" . }}
        </body>
</html>
{{end}}
Run Code Online (Sandbox Code Playgroud)

body.tmpl

{{define "body"}}
{{ range .items }}
{{.count}} items are made of {{.material}}
{{end}}
{{end}}
Run Code Online (Sandbox Code Playgroud)

package main

import (
    "os"
    "text/template"
)

type View struct {
    layout string
    body   string
}

type Smap map[string]string

func (self View) Render(data map[string]interface{}) {
    layout := self.layout + ".tmpl"
    body   := self.body + ".tmpl"
    tmpl   := template.Must(template.New("layout").ParseFiles(layout, body))
    tmpl.ExecuteTemplate(os.Stdout, "layout", data)
} …
Run Code Online (Sandbox Code Playgroud)

whitespace templates go go-html-template

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

为什么.ord不同意.chars?

我的理解.chars是它返回"字形中字符串中的字符数".我的理解.ords是它返回"一个代码点数列表,一个用于字符串中每个字素的基本字符".也就是说,.chars返回字素数并.ords返回每个字素的一个代码点(基数).但是,我在MoakVM 2016.07上的Rakudo 2016.07.1中看到的行为似乎与以下内容不匹配:

> "\x[2764]\x[fe0e]".chars
1
> "\x[2764]\x[fe0e]".ords.fmt("U+%04x")
U+2764 U+fe0e
> "e\x[301]".ords.fmt("U+%04x")
U+00e9
> "0\x[301]".ords.fmt("U+%04x")
U+0030
Run Code Online (Sandbox Code Playgroud)

.chars方法返回HEAVY BLACK HEART和VARIATION SELECTOR-15的预期1(文本表示❤︎而不是表情符号❤️,U + 2764 U + fe0f),但随后.ords返回两个代码点而不仅仅是基数(我预计只是U) 2764).更令人困惑的,如果你拨打.ords的拉丁小写字母E和组合重音符,你拿回U + 00e9(急性拉丁小写字母E).我期待U + 0065,因为LATIN SMALL LETTER E是基本代码点.当没有NFC版本的字符串时(例如U + 0030表示0),我确实得到了预期的结果.

是我的理解.chars.ords公正有缺陷,或者这是一个错误?

unicode perl6

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