使用perl生成数字序列
我正在尝试使用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
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
];