Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用perl生成数字序列_Perl - Fatal编程技术网

使用perl生成数字序列

使用perl生成数字序列,perl,Perl,我正在尝试使用perl生成一个数字序列,如下所示: 1 2 3 4 5 6 7 8 9 10 11 .. n 其中n是用户输入。 所以我提出了下面的逻辑,看起来很新手。希望有人能做得更好 $a = <STDIN>; $ln = 1; $val = 1; $itr = 1; do { do { if ($val <= $a) { print "$val\t"; } else { pr

我正在尝试使用perl生成一个数字序列,如下所示:

1
2 3
4 5 6
7 8 9 10
11 .. n
其中n是用户输入。 所以我提出了下面的逻辑,看起来很新手。希望有人能做得更好

$a   = <STDIN>;
$ln  = 1;
$val = 1;
$itr = 1;

do {
    do {
        if ($val <= $a) {
            print "$val\t";
        } else {
            print "\n";
            exit;
        }
        $val++;
        $itr++;
    } while($itr <= $ln);
    $ln++;
    $itr = 1;
    print "\n";
} while ($a > 0);

欢迎使用Perl和StackOverflow。我有几点建议给你:

在每个perl脚本中始终包含和

别忘了从标准输入中提取您的输入

避免使用带有语句修饰符的do块。取而代之的是始终使用一个或一个循环

避免使用$a或$b作为变量名,因为它们是为您保留的

应用这些更改,并使用数学来确定是否在一行的末尾,可以得到以下脚本:

use strict;
use warnings;

chomp(my $number = <STDIN>);

my $line = 1;

for my $iter (1 .. $number) {
    if ($iter == $line * ($line + 1) / 2 || $iter == $number) {
        print "$iter\n";
        $line++;
    } else {
        print "$iter\t";
    }
}
使用二次方程的替代方案 您还可以使用一条语句获得相同的输出:

my $number = 17;

for (1 .. $number) {
    print $_, ((sqrt(8 * $_ + 1) - 1) / 2) !~ /\./ || $_ == $number ? "\n" : "\t";
}
        if ($number <= $max) {
            print "$number ";
            $number++;
        }
任何时候,如果您想使用基本变量名,请改用默认变量$

如果$\因任何原因无法工作,则应使用有意义的变量名

始终从输入

无论在这种特殊情况下,脚本都可以正常工作。然而,有相当多的问题被张贴在这个网站上,因为一些初学者没有咀嚼他们的输入,然后他们试图在open语句中使用文件名,或者在比较中使用变量

为了避免这些细微的错误,并且只是为了树立良好的习惯,即使不是严格必要的,也要始终致力于演示大量输入

chomp(my $max = <STDIN>);
使用while COND{…;last;}与简单的if语句同义:

my $number = 17;

for (1 .. $number) {
    print $_, ((sqrt(8 * $_ + 1) - 1) / 2) !~ /\./ || $_ == $number ? "\n" : "\t";
}
        if ($number <= $max) {
            print "$number ";
            $number++;
        }
这个最终版本的好处是不会不必要地在不需要打印的行中循环。它与我的第一个解决方案也有一个毫不奇怪的相似之处,除了它包含两个状态变量,而不是我的1

总的来说,我认为这个最终的解决方案对于初学者来说可能是一个更好的建议,因为这个OP是,所以我将投票支持这个答案。阅读完这些评论后,请随意删除除最终答案以外的所有内容


注意:我再也不会编辑这样的问题了。通常做法是编辑问题并在编辑摘要中提供解释。然而,我有很多事情想和大家分享,希望能在将来帮助大家。欢迎使用SO,也感谢您帮助其他人。

要回答原始问题的字面标题,或在perl中生成有限的整数序列,请执行以下操作:

#!/usr/bin/perl
use strict; use warnings;
use Data::Dumper qw(Dumper);
my @monthn = (1..12);
print Dumper \@monthn;
这就产生了

$VAR1 = [
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8,
          9,
          10,
          11,
          12
        ];

哦,哇!!谢谢大家。我为遗漏的细节和不遵守规定而道歉。将确保不会发生这种情况。是的,但用户显式地从外部输入开始。假设我的$number=17,您能调整您的解决方案以正确打印输出吗?编辑得很好,我在您的新版本中添加了很多注释,并且是一个经过清理的最终版本。享受
        if ($number <= $max) {
            print "$number ";
            $number++;
        }
#!/usr/bin/perl
use strict;
use warnings;

print "Enter a number: ";
chomp( my $max = <STDIN> );

my $row = 1;
my $col = 1;

for my $number ( 1 .. $max ) {
    if ($col == $row || $number == $max) {
        $row++;
        $col = 1;
        print "$number\n";
    } else {
        $col++;
        print "$number ";
    }
}
#!/usr/bin/perl
use strict; use warnings;
use Data::Dumper qw(Dumper);
my @monthn = (1..12);
print Dumper \@monthn;
$VAR1 = [
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8,
          9,
          10,
          11,
          12
        ];