我开始学习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开关一起使用..为什么不能正常工作?
执行一个衬管从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所说的).如果不重新进入块,它的值如何更新?
我错过了什么?
我正在努力学习如何调试rakudo和nqp.所以这是我的第一次尝试:
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) 我正在创建一个包,我必须通过它在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) 根据文档,ws语法中方法的默认定义是匹配零个或多个空格字符,只要该点不在单词内:
regex ws { <!ww> \s* }
Run Code Online (Sandbox Code Playgroud)
此定义与以下内容有什么区别:
regex ws { \s+ }
Run Code Online (Sandbox Code Playgroud)
我想知道为什么使用零宽度断言<!ww>而不是更简单的断言\s+?我还注意到默认定义允许匹配零个空格,但是什么时候会真正发生呢?如果使用\s+代替会更清楚\s*吗?
我正在尝试使用全局修饰符从字符串中提取匹配的部分。
考虑:
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脚本,用户可以在其中输入正则表达式和替换字符串.该脚本将搜索一组文件,并根据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) :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这里获得额外的图层?
我有编号的列表大号.还有数另一份名单中号.我需要返回一个列表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) 这个问题是在尝试修复一些安装问题时出现
的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)