如何解决在 void 上下文中无用地使用私有变量,在除法 (/) 中使用未初始化的值 $interval 和非法除以零
how to solve Useless use of private variable in void context, Use of uninitialized value $interval in division (/) and Illegal division by zero at
我没有任何使用 Perl 的经验,所以我无法解决这个问题。你能帮我解决这个问题吗:
Error 1 : Useless use of private variable in void context at ./createnodelist.pl line 51.
Error 2 : Use of uninitialized value $interval in division (/) at ./createnodelist.pl line 10.
Error 3 : Illegal division by zero at ./createnodelist.pl line 10.
基本上,下面的脚本应该加载证书列表并生成一个节点列表,其中分钟数分配给了一个节点:
line 51 print FILE "\n";
line 10 my $jph = ceil(60/$interval);
源代码:
#!/usr/bin/perl
use warnings;
use strict;
use POSIX;
my $interval = $ARGV[0];
my $path = '/etc/puppet/modules/puppet/scripts/puppet_cron';
# Calculate how many jobs per hour we have
my $jph = ceil( 60 / $interval );
# Load list of all nodes
my @nodes = `/usr/sbin / puppetca -la | /usr/ bin / cut -d ' ' -f 2`; #
chomp(@nodes);
# Count number of nodes
my $node_count = scalar(@nodes);
# Count number of nodes per group
my $nodes_per_group = $node_count / $interval;
# Process nodes list and assigne minutes for each node
open( FILE, ">$path/nodes.list" );
for ( my $i = 0; $i < $interval; $i++ ) {
my $minute;
my $group = $i + 1;
my $node_n;
# Process nodes in group
for ( $node_n = 0; $node_n < $nodes_per_group; $node_n ) {
# Assign minutes to a node
my $node = shift(@nodes);
if ($node) {
print FILE "$node;";
for ( my $n = 0; $n < $jph; $n++ ) {
$minute = $i + ( $interval * $n );
if ( $minute
< 60 ) # Only print minutes that actually exist
{
print FILE "$minute";
}
if ( $n != $jph - 1 ) {
print FILE ',';
}
}
}
$node_n++;
print FILE "\n";
}
}
close(FILE);
exit 0;
解决perl问题的第一条规则:
设置use strict;
use warnings;
。
其次:阅读错误信息。
您的问题在第 10 行:除以零。唯一的可能性是 $interval
为零。或者未定义。或者未初始化。如果您打开 strict/warnings,那么它 可能 会向您发出有关后者的警告。
第 51 行:在 void 上下文中无用地使用私有变量 - 基本上意味着该语句没有做任何事情。可能意味着 FILE
没有正确打开。
但更根本的是 - 我们无法从您的代码中获取更多细节。 MCVE - 最小的完整可验证示例 - https://whosebug.com/help/mcve
编辑:
发布代码后:$interval
被设置为 $ARGV[0]
。您在命令行上提供什么参数?如果未提供任何值,那么您将得到被零除的错误,因为 $interval
未定义。
根据您的评论 - 您是在毫无争议地调用它。因此 $interval
将始终未定义,这将为您提供所需的错误消息。要么:
使用参数调用脚本
为 $interval
设置默认值,例如my $interval = $ARGV[0] || 60;
对于你的第二个问题 - 在 void 上下文中无用地使用私有变量:
for ( $node_n = 0; $node_n < $nodes_per_group; $node_n ) {
您没有递增 $node_n
它在空上下文中使用。因此警告。
for ( $node_n = 0; $node_n < $nodes_per_group; $node_n++ ) {
我没有任何使用 Perl 的经验,所以我无法解决这个问题。你能帮我解决这个问题吗:
Error 1 : Useless use of private variable in void context at ./createnodelist.pl line 51.
Error 2 : Use of uninitialized value $interval in division (/) at ./createnodelist.pl line 10.
Error 3 : Illegal division by zero at ./createnodelist.pl line 10.
基本上,下面的脚本应该加载证书列表并生成一个节点列表,其中分钟数分配给了一个节点:
line 51 print FILE "\n";
line 10 my $jph = ceil(60/$interval);
源代码:
#!/usr/bin/perl
use warnings;
use strict;
use POSIX;
my $interval = $ARGV[0];
my $path = '/etc/puppet/modules/puppet/scripts/puppet_cron';
# Calculate how many jobs per hour we have
my $jph = ceil( 60 / $interval );
# Load list of all nodes
my @nodes = `/usr/sbin / puppetca -la | /usr/ bin / cut -d ' ' -f 2`; #
chomp(@nodes);
# Count number of nodes
my $node_count = scalar(@nodes);
# Count number of nodes per group
my $nodes_per_group = $node_count / $interval;
# Process nodes list and assigne minutes for each node
open( FILE, ">$path/nodes.list" );
for ( my $i = 0; $i < $interval; $i++ ) {
my $minute;
my $group = $i + 1;
my $node_n;
# Process nodes in group
for ( $node_n = 0; $node_n < $nodes_per_group; $node_n ) {
# Assign minutes to a node
my $node = shift(@nodes);
if ($node) {
print FILE "$node;";
for ( my $n = 0; $n < $jph; $n++ ) {
$minute = $i + ( $interval * $n );
if ( $minute
< 60 ) # Only print minutes that actually exist
{
print FILE "$minute";
}
if ( $n != $jph - 1 ) {
print FILE ',';
}
}
}
$node_n++;
print FILE "\n";
}
}
close(FILE);
exit 0;
解决perl问题的第一条规则:
设置use strict;
use warnings;
。
其次:阅读错误信息。
您的问题在第 10 行:除以零。唯一的可能性是 $interval
为零。或者未定义。或者未初始化。如果您打开 strict/warnings,那么它 可能 会向您发出有关后者的警告。
第 51 行:在 void 上下文中无用地使用私有变量 - 基本上意味着该语句没有做任何事情。可能意味着 FILE
没有正确打开。
但更根本的是 - 我们无法从您的代码中获取更多细节。 MCVE - 最小的完整可验证示例 - https://whosebug.com/help/mcve
编辑:
发布代码后:$interval
被设置为 $ARGV[0]
。您在命令行上提供什么参数?如果未提供任何值,那么您将得到被零除的错误,因为 $interval
未定义。
根据您的评论 - 您是在毫无争议地调用它。因此 $interval
将始终未定义,这将为您提供所需的错误消息。要么:
使用参数调用脚本
为
$interval
设置默认值,例如my $interval = $ARGV[0] || 60;
对于你的第二个问题 - 在 void 上下文中无用地使用私有变量:
for ( $node_n = 0; $node_n < $nodes_per_group; $node_n ) {
您没有递增 $node_n
它在空上下文中使用。因此警告。
for ( $node_n = 0; $node_n < $nodes_per_group; $node_n++ ) {