如何解决在void上下文中无用的私有变量的使用,在部门(/)中使用未初始化的值$ interval和在零的非法划分

时间:2015-01-02 23:30:40

标签: perl

我没有任何使用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;

1 个答案:

答案 0 :(得分:1)

解决perl问题的第一条规则:

设置use strict; use warnings;

第二:阅读错误消息。

你的问题在第10行:除以零。唯一的可能性是$interval为零。或者未定义。或者未初始化。如果您打开严格/警告,那么可能会向您发出有关后者的警告。

第51行:在void上下文中无用的私有变量 - 基本上意味着该语句不做任何事情。可能意味着FILE尚未正确打开。

但更重要的是 - 我们无法帮助您从代码中获取更多细节。 MCVE - 最小的完整可验证示例 - https://stackoverflow.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++ ) {