如何解决如何基于Perl中的用户控制台输入执行循环次数?
我想根据用户提供的参数打印一组N个4位数字。我有以下代码打印一个随机数。到目前为止,我有一段代码可以生成可能不错的伪随机数。
#!/usr/bin/perl
use strict;
use warnings qw( all );
use feature qw( say );
my @digits = ('0'..'9');
my $len = 4;
my $num = '';
for (1..$len) {
$num .= $chars[int rand @chars];
}
say $num;
我想以./a.pl 5
的身份执行脚本以获取以下输出:
1342
6322
7589
3478
3457
最好的方法是什么?
解决方法
从@ARGV
中读取参数。有多种方法可以做到:
((定义的//
或运算符需要use 5.10.1
或更高版本)
# Use a default value if unspecified.
my $x = shift // 42;
# Argument is required.
my $x = shift // die "usage: $0 ...\n";
shift
默认情况下将第一个元素移出@_
数组,但在外部使用@ARGV
子例程范围。
$ARGV[0]
在上面的代码片段中将具有相同的效果,而无需修改参数数组。
Getopt
通常用于更复杂的参数处理。
您可以从@ARGV
获取命令行参数。所以,像这样:
#!/usr/bin/perl
use strict;
use warnings qw( all );
use feature qw( say );
# shift() without arguments outside of a subroutine
# will work on @ARGV.
# // 1 means "give it a default value of 1"
my $count = shift // 1;
my @digits = ('0'..'9');
my $len = 4;
for (1 .. $count) {
# Move the declaration of $num inside the loop
my $num = '';
for (1..$len) {
$num .= $digits[int rand @digits];
}
say $num;
}
但是,我认为您在增加数字方面做了大量工作。您基本上想要一个介于0到9999之间的数字-所以要求这个。
#!/usr/bin/perl
use strict;
use warnings qw( all );
use feature qw( say );
my $count = shift // 1;
my $len = 4;
my $limit = 10 ** $len; # 10**4 = 10_000
for (1 .. $count) {
my $num = int rand $limit;
say $num;
}
这是一个小问题,因为小于1,000的数字开头不会为零。我们可以使用sprintf()
来解决此问题。
#!/usr/bin/perl
use strict;
use warnings qw( all );
use feature qw( say );
# shift() without arguments outside of a subroutine
# will work on @ARGV.
# // 1 means "give it a default value of 1"
my $count = shift // 1;
my $len = 4;
my $limit = 10 ** $len; # 10**4 = 10_000
for (1 .. $count) {
# Slight complication here. We want to use $len in
# the string,but it would get joined to the 's'
# that follows it. So we use the (slightly obscure)
# ${len} syntax which fixes that.
my $num = sprintf "%0${len}s",int rand $limit;
say $num;
}
,
请查看伪随机数发生器的简短版本。
您可以指定在命令行上需要生成多少个数字,数字的数字位置在代码my $len = 4;
中是固定的
use strict;
use warnings;
my $count = shift || 10;
my $len = 4;
printf "%04d\n",(int rand 10**$len) while $count--;
输出示例numgen.pl 10
8730
1669
3433
3352
7654
5908
4148
6890
5905
3840
代码的扩展版本,您可以在其中指定
- 需要生成多少个数字
- 一个数字中应该有多少个数字位置
- 使用方面的简要帮助
- 生成程序的手册页
use strict;
use warnings;
use Getopt::Long qw(GetOptions);
use Pod::Usage;
my @args = (
'count|c=i','length|l=i','help|h','man|m','debug|d'
);
my %opt = (
count => 10,length => 4,debug => 0
);
GetOptions(\%opt,@args) or pod2usage(2);
pod2usage(1) if $opt{help};
pod2usage(-exitval => 0,-verbose => 2) if $opt{man};
printf "%04d\n",(int rand 10**$opt{length}) while $opt{count}--;
__END__
=pod
=head1 NAME
numgen.pl - pseudo random number generator
=head1 SYNOPSIS
numgen.pl [options]
Options:
-c,--count count of generated numbers
-l,--length position length of numbers
-h,--help brief help message
-m,--man full documentation
-d,--debug output debug information
=head1 OPTIONS
=over 4
=item B<-c,--count>
Count specifies how many numbers are required to generate
=item B<-l,--lenght>
Length specifies number positions in a number
=item B<-h,--help>
Print a brief help message and exits.
=item B<-m,--man>
Prints the manual page and exits.
=item B<-d,--debug>
Print debug information.
=back
=head1 DESCRIPTION
B<This program> generates pseudo-random numbers for some purpose
=head1 AUTHOR
Polar Bear Aug 27,2020
=head1 REPORTING BUGS
E-mail L<mailto:bugs@inter.net>
=head1 COPYRIGHT
Copyright information
=head1 SEE ALSO
L<The Perl Home page|http://www.perl.org/>
=cut
输出示例numgen.pl -c 5 -l 12
686567922196
677796459148
718949335898
869407116059
203852689254
numgen.pl -h
Usage:
numgen.pl [options]
Options:
-c,--count count of generated numbers
-l,--length position length of numbers
-h,--help brief help message
-m,--man full documentation
-d,--debug output debug information
Options:
-c,--count
Count specifies how many numbers are required to generate
-l,--lenght
Length specifies number positions in a number
-h,--help
Print a brief help message and exits.
-m,--man
Prints the manual page and exits.
-d,--debug
Print debug information.
numgen.pl --man
NAME
numgen.pl - pseudo random number generator
SYNOPSIS
numgen.pl [options]
Options:
-c,--debug output debug information
OPTIONS
-c,--debug
Print debug information.
DESCRIPTION
This program generates pseudo-random numbers for some purpose
AUTHOR
Polar Bear Aug 27,2020
REPORTING BUGS
E-mail <mailto:bugs@inter.net>
COPYRIGHT
Copyright information
SEE ALSO
The Perl Home page <http://www.perl.org/>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。