我在perl中编写了这个脚本,在那里我提取传递计数和失败计数并将其打印为1和-1。 以下是我的尝试,它运作得相当好,但我想知道是否有一种方法可以即兴创作代码?
my $pc = 10;
my $fc = 5;
my $v = "";
my $c = 0;
while ($c < $pc){
if ($c > 0) {
$v .= ",";
}
$c++;
$v .= "1";
}
$v .= ",";
$c=0;
while ($c < $fc){
if ($c > 0) {
$v .= ",";
}
$c++;
$v .= "-1";
}
print $v;
print "\n";
output:1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1
欣赏任何想法或建议。
答案 0 :(得分:1)
Perl提供了广泛的高级工具,通常我们不需要显式循环。
直接回答问题
my $v = join ',', (1) x $pc, (-1) x $fc;
我们使用列表1
上的repetition operator (x
)构建(1)
列表。由于join中的模式后面的所有内容都是其输入列表,因此我们还可以使用它们之间的comma operator来提供-1
的列表。然后,,
当然,如果您需要动态解决有关这些1
的任何内容,这将无效。
这是另一种方法,适用于更一般的条件。
+1
my $v = join ',', map { 1 } 1..$pc;
以及-1
$v .= join ',', map { -1 } 1..$fc;
如果需要和合适的话,这也可以像第一个例子一样被制作成一行。
map为输入列表的每个元素运行块中的代码,并返回结果列表。在块中,每个元素都在$_ variable中可用,代码通常使用它。这就是我们如何以功能(和声明)方式从另一个列表生成列表。
但在此示例中,您只需要1
的列表,因此每次1
次从块返回$pc
。然后该输出列表成为join的输入,元素由,
连接。对于$fc
,第二行执行-1
次,然后将加入的字符串追加到$v
。
答案 1 :(得分:0)
我使用了一个数组来存储输出,这是一种处理多个值的更结构化的方法。请在下面找到我修改过的代码。
my $pc = 10;
my $fc = 5;
my @v;
my $c = 0;
$c=$pc;
while ($c){
push @v, "1";
$c--;
}
$c=$fc;
while ($c){
push @v, "-1";
$c--;
}
local $, = ',';
print @v;
print "\n";
注意 - 请注意,输出位于数组中,分隔符(,)仅用于格式化输出,并且不存在于数组中。使用$, = ','
我们可以将任何东西设置为输出分隔符。
答案 2 :(得分:0)
首先,让我们修复$pc == 0
和$fc > 0
返回,-1,-1,...
而不是-1,-1,...
的错误。
my $v = "";
my $c = 0;
for (1..$pc) {
$v .= "," if $c++ > 0;
$v .= "1";
}
for (1..$fc) {
$v .= "," if $c++ > 0;
$v .= "-1";
}
其次,让我们使用数组来收集值,并加入内容以避免所有逗号。
my @v;
for (1..$pc) {
push @v, "1";
}
for (1..$fc) {
push @v, "-1";
}
my $v = join(',', @v);
这看起来很像map
[1] 的定义!所以,
my @v;
push @v, map { "1" } 1..$pc;
push @v, map { "-1" } 1..$fc;
my $v = join(',', @v);
或者只是
my $v = join ',',
map({ "1" } 1..$pc),
map({ "-1" } 1..$fc);
最后,由于map
的主体是常数,我们可以使用重复运算符。
my $v = join ',',
( "1" ) x $pc,
( "-1" ) x $fc;
也就是说
my @v; for (LIST) { push @v, f($_) }
可以写成
my @v = map { f($_) } LIST;