程序打印通过计数为1,故障计数为-1

时间:2017-02-13 05:10:08

标签: perl loops

我在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

欣赏任何想法或建议。

3 个答案:

答案 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;
  1. 也就是说

    my @v; for (LIST) { push @v, f($_) }
    

    可以写成

    my @v = map { f($_) } LIST;