小编Håk*_*and的帖子

在perl中使用-e和-s开关

我开始学习Perl.我试过了

perl -e 'print "The value of \$x=$x\n";'
Run Code Online (Sandbox Code Playgroud)

得到:

The value of $x=
Run Code Online (Sandbox Code Playgroud)

然而:

perl -s -x=10 -e 'print "The value of \$x=$x\n";'
Run Code Online (Sandbox Code Playgroud)

No Perl script found in input
Run Code Online (Sandbox Code Playgroud)

我想将-s开关与-e开关一起使用..为什么不能正常工作?

perl

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

Perl6一个班轮执行.主题如何更新?

执行一个衬管从stdin一次处理一行CSV:

perl6 -ne 'my @a; $_.split(",").kv.map: {@a[$^k]+=$^v}; say @a; ENTER {say "ENTER"}; BEGIN {say "BEGIN"}; LEAVE {say "LEAVE"}; END {say "END"}';
Run Code Online (Sandbox Code Playgroud)

输入:

1,1
1,1
^D
Run Code Online (Sandbox Code Playgroud)

给出以下输出:

BEGIN
ENTER
1,1
[1 1]
1,1
[2 2]
LEAVE
END
Run Code Online (Sandbox Code Playgroud)

在这里我们可以看到,一个衬里不是多次执行的块,因为ENTER和LEAVE阶段只执行一次.

当变量@a正在累积时,这是有意义的.如果一个衬管是块,则每次都会重置@a的值.

我的问题是主题变量$ _如何更新?主题变量是一个Str(至少是$ _.^ name所说的).如果不重新进入块,它的值如何更新?

我错过了什么?

command-line perl6 raku

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

重新编译nqp后,"缺少或错误版本的依赖"

我正在努力学习如何调试rakudonqp.所以这是我的第一次尝试:

cd $HOME/debug
git clone https://github.com/rakudo/rakudo.git
cd rakudo
perl Configure.pl --gen-moar --gen-nqp --backends=moar
make
make install # installs into ./install/bin
export PATH=${PWD}/install/bin:$PATH
export PATH=${PWD}/install/share/perl6/site/bin:$PATH
# Testing executable:
perl6 --version
# This is Rakudo version 2018.12-256-g9517c3779 built on MoarVM version 2018.12-36-g34fac5f4e
# implementing Perl 6.d.
# 
# Now modifying an nqp file:
cd nqp
# Change a file: E.g. : vim src/HLL/Compiler.nqp
# I added a line after line 293 in src/HLL/Compiler.nqp:
#   nqp::say("*** Debugging message: HLL::Compiler::command_eval() …
Run Code Online (Sandbox Code Playgroud)

rakudo perl6 raku nqp

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

通过子名称获取符号的值

我正在创建一个包,我必须通过它在sub中的名称来获取符号的值,而符号在sub之外定义.

这是简化的代码,它按预期工作:

#! /usr/bin/env perl6 

sub dump_value($symbol) {
    say ::("$symbol")
}

# usage:
my $x = 10;
dump_value('$x');

# expected output: 10
# actual output: 10
Run Code Online (Sandbox Code Playgroud)

然后我将'dump_value'放在一个独立的文件中,如下所示:

# somelib.pm6
unit module somelib;

sub dump_value($symbol) is export {
    say ::("$symbol")
}
Run Code Online (Sandbox Code Playgroud)
# client.pl6
#! /usr/bin/env perl6

use lib ".";
use somelib;

my $x = 10;

dump_value('$x');
Run Code Online (Sandbox Code Playgroud)

编译抱怨:

No such symbol '$x'
  in sub dump_value at xxx/somelib.pm6 (somelib) line 3
  in block <unit> at ./client.pl6 line 8
Run Code Online (Sandbox Code Playgroud)

以下是一些实验.他们都没有成功.

say ::("MY::$symbol")

say ::("OUR::$symbol") …
Run Code Online (Sandbox Code Playgroud)

scope string-interpolation perl6 symbol-table raku

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

语法中空格方法ws的默认定义

根据文档ws语法中方法的默认定义是匹配零个或多个空格字符,只要该点不在单词内:

regex ws { <!ww> \s* }
Run Code Online (Sandbox Code Playgroud)

此定义与以下内容有什么区别:

regex ws { \s+ }
Run Code Online (Sandbox Code Playgroud)

我想知道为什么使用零宽度断言<!ww>而不是更简单的断言\s+?我还注意到默认定义允许匹配零个空格,但是什么时候会真正发生呢?如果使用\s+代替会更清楚\s*吗?

grammar perl6 raku

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

在 foreach 循环中使用全局修饰符从 perl 正则表达式中提取匹配项

我正在尝试使用全局修饰符从字符串中提取匹配的部分。

考虑:

my $a="A B C";
my $b="A B C";

foreach ($a =~ /(\w)/g) {
    print "$1\n";
}
while ($b =~ /(\w)/g) {
    print "$1\n";
}
Run Code Online (Sandbox Code Playgroud)

输出:

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

我很迷惑; 为什么while循环有效,而foreach循环无效?(它打印C三遍)。

perl

5
推荐指数
2
解决办法
818
查看次数

当用户输入右侧时,使用e //修饰符安全地使用s ///操作符

我正在编写一个Perl脚本,用户可以在其中输入正则表达式和替换字符串.该脚本将搜索一组文件,并根据s///应用用户输入的perl 运算符应用更改.

为了使问题稍微复杂化,允许替换字符串包含反向引用以引用正则表达式中的捕获组.例如,如果正则表达式b(.*?)a和替换字符串是a$1b$1应该按字面意思处理,但rater作为反向捕获第一组.

在这个设置中,我想知道当ee用户输入该s///操作符的右侧时是否可以安全地使用修饰符(以评估用户输入中的反向引用)?例如:

use strict;
use warnings;
my $str = 'abaaca';

my $replacement = 'do{ use Env qw(HOME); unlink "$HOME/important.txt" }';

$str =~ s/a(.*?)a/$replacement/gee;
Run Code Online (Sandbox Code Playgroud)

将是不幸的..但后来我有想法引用用户输入(把它放在一对双引号内)后转义双引号和美元符号(后面没有数字),然后做替换:

use feature qw(say);
use strict;
use warnings;

my $str = 'abaaca';

my $replacement = shift;
$replacement =~ s/\"/\\\"/g;
$replacement =~ s/\$(?!\d)/\\\$/g;
$replacement = '"' . $replacement . '"';
$str =~ s/a(.*?)a/$replacement/gee;
say $str;
Run Code Online (Sandbox Code Playgroud)

对我来说,这似乎乍一看,或者我错过了什么?例如,如果调用脚本test.pl并且用户将其运行为:

$ test.pl 'do{ "a$b" …
Run Code Online (Sandbox Code Playgroud)

regex perl

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

为什么PerlIO :: encoding插入额外的utf8层?

PerlIO文档说:

:encoding使用:编码(ENCODING)在open()或binmode()中安装一个透明地进行字符集和编码转换的层,例如从Shift-JIS到Unicode.请注意,在stdio an:encoding下还可以启用:utf8.有关更多信息,请参阅PerlIO :: encoding.

这是一个测试脚本:

use feature qw(say);
use strict;
use warnings;

my $fn = 'test.txt';
for my $mode ('>', '>:encoding(utf8)' ) {
    open( my $fh, $mode, $fn);
    say  join ' ', (PerlIO::get_layers($fh));
    close $fh;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

unix perlio
unix perlio encoding(utf8) utf8
Run Code Online (Sandbox Code Playgroud)

为什么我在utf8这里获得额外的图层?

perl encoding

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

Perl6:将列表中的元素与另一个列表匹配

我有编号的列表大号.还有数另一份名单中号.我需要返回一个列表L"在发现号的两个 大号中号.

编辑:数学上,我正在寻找 Multiset交叉点.

例:

大号 = 3,14,15, 9,2,6
中号 = 9,7, ,,1 ,1 L" = 9,1,2,121

我为此编写了以下代码:

my @some-numbers = 3, 1, 4, 1, 5, 9, 2, 6;
my @to-match     = 9, 7, 1, 2, 1, 1;
my @matched;

my %histogram;
for @some-numbers -> $n { %histogram{$n}++ };

for @to-match -> $n {
    next …
Run Code Online (Sandbox Code Playgroud)

perl6 raku

5
推荐指数
2
解决办法
180
查看次数

如何使用 -fPIC 标志重新编译 libperl.a 目标文件?

这个问题是在尝试修复一些安装问题时出现QtCore4。在某些时候make尝试运行以下命令:

/usr/bin/c++  -fPIC -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong \
 -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O3 -DNDEBUG  \
 -shared -Wl,-soname,QtCore4.so -o ../../blib/arch/auto/QtCore4/QtCore4.so \
 CMakeFiles/perlqtcore4.dir/binding.cpp.o \
 CMakeFiles/perlqtcore4.dir/handlers.cpp.o \
 CMakeFiles/perlqtcore4.dir/marshall_types.cpp.o \
 CMakeFiles/perlqtcore4.dir/util.cpp.o \
 CMakeFiles/perlqtcore4.dir/QtCore4.c.o \
 -lQtCore -lQtGui -lQtNetwork \
 /home/hakon/perlbrew/perls/perl-5.24.1/lib/5.24.1/x86_64-linux/CORE/libperl.a \
 ../../smokeqt/qtgui/libsmokeqtgui.so.3.0.0 \
 ../../smokeqt/qtnetwork/libsmokeqtnetwork.so.3.0.0 \
 -lpthread -lnsl -ldl -lm -lcrypt -lutil -lc -lQtGui -lQtNetwork \
 ../../smokeqt/qtcore/libsmokeqtcore.so.3.0.0 -lQtCore \
 ../../smokegen/bin/libsmokebase.so.3.0.0 \
 -Wl,-rpath,/home/hakon/Qt4-0.99.0/smokeqt/qtgui:/home/hakon/Qt4-0.99.0/smokeqt/qtnetwork:/home/hakon/Qt4-0.99.0/smokeqt/qtcore:/home/hakon/Qt4-0.99.0/smokegen/bin: 
Run Code Online (Sandbox Code Playgroud)

失败,来自链接器的以下错误消息:

/usr/bin/ld: /home/hakon/perlbrew/perls/perl-5.24.1/lib/5.24.1/x86_64-linux/CORE/libperl.a(toke.o): 
  relocation R_X86_64_PC32 against symbol `PL_curcop' can not be used when making
  a shared object; recompile with …
Run Code Online (Sandbox Code Playgroud)

perl

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