我正在尝试生成包含10个具有随机质量分数的随机序列的FASTQ文件.我最初使用以下代码,工作正常:
my @seq = (rand_fa_seq() for ^10);
my @qual = (rand_qual() for ^10);
@seq.perl.say;
@qual.perl.say;
sub rand_fa_seq
{
return join("", roll(20,"ACGT".comb));
}
sub rand_qual
{
return join("", roll(20,"EFGHIJ".comb))
}
Run Code Online (Sandbox Code Playgroud)
但是,想要进一步简化它,我想也许我可以从右手语句中删除括号.当我这样做,我只有在一个单一的元素@seq和@qual.
my @seq = rand_fa_seq() for ^10;
my @qual = rand_qual() for ^10;
@seq.perl.say;
@qual.perl.say;
sub rand_fa_seq
{
return join("", roll(20,"ACGT".comb));
}
sub rand_qual
{
return join("", roll(20,"EFGHIJ".comb))
}
Run Code Online (Sandbox Code Playgroud)
这是一个错误还是它应该表现的方式?如果没有括号,这是一个标量上下文吗?将在大名单重构改变这种行为?
我见过这种行为的Perl 6解释器的版本:
MoarVM:
基于MoarVM版本2015.03-60-g36d56f7构建的perl6版本2015.03-204-g8578022
JVM:
perl6版本2015.03-305-ga95107d建立在JVM java版本"1.7.0_79"
OpenJDK运行时环境(rhel-2.5.5.1.el7_1-x86_64 u79-b14)
OpenJDK 64位服务器VM(版本24.79-b02,混合模式)
我可以gist在say内置函数上调用该方法:
&say.gist
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)sub say (| is raw) { #`(Sub|54790064) ... }
为什么我不能打电话gist的while?
&while.gist
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)===SORRY!=== Error while compiling <unknown file> Undeclared routine: while used at line 1
显然while不是"常规"而是say.但我认为Perl 6中的所有内置函数都是我们可以重新定义的函数.
我可以调用^methods一个对象并列出我可以调用的方法名称:
my $object = 'Camelia';
my @object_methods = $object.^methods;
@object_methods.map( { .gist } ).sort.join("\n").say;
Run Code Online (Sandbox Code Playgroud)
^methods返回我存储的列表@object_methods,然后我通过调用gist每个方法来改变方法thingys的列表,以获得该方法的人类感知形式.
但是,^in ^methods是隐含的.HOW,如对象文档末尾所示,这也应该有效:
my $object = 'Camelia';
my @object_methods = $object.HOW.methods;
Run Code Online (Sandbox Code Playgroud)
但是,我收到一个错误:
Too few positionals passed; expected 2 arguments but got 1
in any methods at gen/moar/m-Metamodel.nqp line 490
in block <unit> at...
Run Code Online (Sandbox Code Playgroud)
并且,对于它的价值而言,这对于一种试图对这类事物是个人友好的语言来说是一个可怕的错误信息.文件m-Metamodel.nqp不是我的perl6安装的一部分.它甚至不是我可以google的东西,因为正如路径所暗示的那样,它是汇编产生的东西.而且,编译取决于版本.
我有以下琐碎的脚本:
#!/usr/bin/env perl6
use v6.c;
sub MAIN($x)
{
say "$x squared is { $x*$x }";
}
Run Code Online (Sandbox Code Playgroud)
当用实数调用它时,这种方法非常好,但我也希望将它传递给复数.当我按原样尝试时,会发生以下情况:
% ./square i
Cannot convert string to number: base-10 number must begin with valid digits or '.' in '?i' (indicated by ?)
in sub MAIN at ./square line 7
in block <unit> at ./square line 5
Actually thrown at:
in sub MAIN at ./square line 7
in block <unit> at ./square line 5
Run Code Online (Sandbox Code Playgroud)
当我将脚本更改为
#!/usr/bin/env perl6
use v6.c;
sub MAIN(Complex $x)
{
say …Run Code Online (Sandbox Code Playgroud) 我想使用单行程序通过使用状态变量来打印文件的中间部分,以指示当前行是否在文件的所需部分内.但是我无法初始化状态变量.初始化是如此简单,我只是找不到问题所在.请帮忙.谢谢.
该文件名为testFile.txt,并包含以下行:
section 0; state 0; not needed
= start section 1 =
state 1; needed
= end section 1 =
section 2; state 2; not needed
Run Code Online (Sandbox Code Playgroud)
我的单行是
cat testFile.txt | perl6 -ne ' state $x = 0; say "$x--> "; if $_ ~~ m/ "start" / { $x=1; }; if $x == 1 { .say; }; if $_ ~~ m/ "end" / { $x = 2; }'
Run Code Online (Sandbox Code Playgroud)
并且输出显示$ x = 0没有进行初始化:
Use of uninitialized value $x of type Any …Run Code Online (Sandbox Code Playgroud) 问题:
是否/ Powershells的Perl6对应物是什么get-member来"分析"变量的属性?
说明:
在Perl 6中,您可以获取变量的属性/属性,例如:
my $num=16.03;
say $num.numerator; # output: 1603
say $num.denominator; # output: 100
say $num.nude; # output: (1603 100)
say $num.WHAT; # output: (Rat)
Run Code Online (Sandbox Code Playgroud)
如何找出变量具有哪些属性/属性(分子等)和方法/函数(WHAT)?
在Powershell中,我将管道变量get-member,如:
$num | get-member和将显示所有属性和功能.
可能我做的事情完全错了,但有没有办法修改和组合regexes使用子程序?下面的程序不会编译.
sub a(Regex $r1) {
return rx/ <$r1> a /
}
my regex letter_b { b };
my $new = a(letter_b);
say $new;
Run Code Online (Sandbox Code Playgroud) 我开始编写BibTeX解析器.我想做的第一件事是解析一个支撑项目.例如,支撑项可以是作者字段或标题.字段中可能有嵌套的大括号.下面的代码并没有处理嵌套括号:
use v6;
my $str = q:to/END/;
author={Belayneh, M. and Geiger, S. and Matth{\"{a}}i, S.K.},
END
$str .= chomp;
grammar ExtractBraced {
rule TOP {
'author=' <braced-item> .*
}
rule braced-item { '{' <-[}]>* '}' }
}
ExtractBraced.parse( $str ).say;
Run Code Online (Sandbox Code Playgroud)
输出:
?author={Belayneh, M. and Geiger, S. and Matth{\"{a}}i, S.K.},?
braced-item => ?{Belayneh, M. and Geiger, S. and Matth{\"{a}?
Run Code Online (Sandbox Code Playgroud)
现在,为了使解析器接受嵌套大括号,我想保留当前解析的开括号数量的计数器,当遇到右大括号时,我们减少计数器.如果计数器达到零,我们假设我们已经解析了完整的项目.
为了遵循这个想法,我尝试拆分braced-item正则表达式,对每个char实现语法操作.(braced-item-char下面正则表达式的操作方法应该处理大括号计数器):
grammar ExtractBraced {
rule TOP {
'author=' <braced-item> .*
}
rule braced-item { …Run Code Online (Sandbox Code Playgroud) Perl6的新手,试图找出我在这里做错了什么.问题是一个简单的校验和,它取csv中每行的最大值和最小值的差值
它返回的最大值和最小值完全错误.对于csv中的第一行,它返回max为71,min为104,这是不正确的.
#!/usr/bin/env perl6
use Text::CSV;
sub checksum {
my $sum = 0;
my @data = csv(in => "input.csv");
for @data -> @value {
$sum += (max @value) - (min @value);
}
say $sum;
}
checksum
Run Code Online (Sandbox Code Playgroud) 在for循环中,为另一个变量分配了一个值。已经分配了值的变量将从下一次迭代中分配值。最后,两个变量具有相同的值。该代码用于验证文件中的数据。当我打印值时,它将为第一次迭代打印正确的值,但是在下一次迭代中,将更改在第一次迭代中分配的值。当我在for循环中打印$ value3和$ value4的值时,它对$ value4显示空值,对$ value3显示一些值,但是在下一次迭代中,$ value3的值将被$ value4的值覆盖
我已经尝试过rakudo perl 6.c
my $fh= $!FileName.IO.open;
my $fileObject = FileValidation.new( file => $fh );
for (3,4).list {
put "Iteration: ", $_;
if ($_ == 4) {
$value4 := $fileObject.FileValidationFunction(%.ValidationRules{4}<ValidationFunction>, %.ValidationRules{4}<Arguments>);
}
if ($_ == 3) {
$value3 := $fileObject.FileValidationFunction(%.ValidationRules{3}<ValidationFunction>, %.ValidationRules{3}<Arguments>);
}
$fh.seek: SeekFromBeginning;
}
Run Code Online (Sandbox Code Playgroud)