小编vin*_*k89的帖子

Perl 处理后向 JSON 数据添加内容

我有一个 json 文件,我正在使用 perlJSON模块处理它。

一旦我处理它,我想在其中插入一些内容。

这是我的输入 json 文件:

{
  "sequence" : [ 
  {
    "type" : "event",
    "attribute" : {     
      "contentText" : "Test Content",
      "contentNumber" : "11"
    }
  } 
  ],
  "current" : 0,
  "next" : 1
}
Run Code Online (Sandbox Code Playgroud)

下面是我的脚本:

#!/usr/bin/perl

use strict;
use warnings;

use JSON;
use Data::Dumper;

my $needed = 2;
my $filename = "test_file.json";

my $json_text = do {
            open(my $json_fh, "<:encoding(UTF-8)", $filename)
            or die("Can't open \$filename\": $!\n");
            local $/;
            <$json_fh>
    };

my $json = JSON->new;
my $data …
Run Code Online (Sandbox Code Playgroud)

perl json

2
推荐指数
1
解决办法
251
查看次数

为什么在没有引号的 Perl 中的 IF 条件下无法解析数字

我有一个脚本,它将根据timeinIF条件执行某些操作。所以基本上IF会寻找当前时间,即小时和分钟。

这是脚本:

use strict;
use warnings;

my $TIME = `date '+%H%M'`;
chomp $TIME;

print $TIME."\n";

if (( $TIME > 0100) && ($TIME < 0300)){
        print "1st IF\n";
} elsif (( $TIME > 0300) && ($TIME < 0500)){
        print "2nd IF\n";
} else {
        print "Default IF\n";
}
Run Code Online (Sandbox Code Playgroud)

让我们说现在是时候了0130,它假设打印1st IF. 但它的印刷Default IF。同样,当时间0430到了,它假设打印2nd IF. 但它的印刷Default IF

但是当我用双引号将时间值括起来时,""它就起作用了。如下图——

if (( $TIME > "0100") …
Run Code Online (Sandbox Code Playgroud)

perl datetime

2
推荐指数
1
解决办法
47
查看次数

格式化散列内容以生成报告

我有一个散列,其中包含如下数据:

my %hash = (
    '150' => {
             'priority' => 'High',
             'node' => 'Node1',
             'delta' => '00:05:00'
           },
    '170' => {
             'delta' => '00:00:30',
             'node' => 'Node2',
             'priority' => 'Medium'
           }
);
Run Code Online (Sandbox Code Playgroud)

我正在使用foreach循环迭代它并生成报告 (.txt) 文件。

所以,我需要的格式如下:

EVENTID              NODE                 DELTA                PRIORITY
-------------------- -------------------- -------------------- --------------------
150                  Node1                00:05:00             High
170                  Node2                00:00:30             Medium
Run Code Online (Sandbox Code Playgroud)

下面是我格式化结果的脚本:

...
...
open(my $fh, '>', "report_file.txt") or die "Cannot open a file : $!";

printf $fh("%-20s %-20s %-20s %-20s\n", 'EVENTID', 'NODE', 'DELTA', 'PRIORITY');
printf $fh("%-20s …
Run Code Online (Sandbox Code Playgroud)

perl report

2
推荐指数
1
解决办法
89
查看次数

Perl 加载模块 BEGIN

我有这个代码

print "Starting\n";
BEGIN {
        $module='Data::Dumper';
        $module_available=1;
        eval "use $module; 1" or $module_available = 0;
        }
$var=1;
print "Module=$module_available\n";
print Dumper $var if ($module_available==1);
Run Code Online (Sandbox Code Playgroud)

输出是

Starting
Module=1
$VAR1 = 1;
Run Code Online (Sandbox Code Playgroud)

和这个

print "Starting\n";
        $module='Data::Dumper';
        $module_available=1;
        eval "use $module; 1" or $module_available = 0;
$var=1;
print "Module=$module_available\n";
print Dumper $var if ($module_available==1);
Run Code Online (Sandbox Code Playgroud)

和输出

Starting
Module=1
Run Code Online (Sandbox Code Playgroud)

为什么在第一个场景中打印变量

perl

2
推荐指数
1
解决办法
90
查看次数

Perl如何将数组作为参数传递给另一个Perl脚本

我有2个Perl脚本,其中通过将array作为参数primary_script.pl来调用secondary_script.pl脚本。

我的代码如下所示:
primary_script.pl

#!/usr/bin/perl

use Data::Dumper;
my @array = qw/1 2 3 4 5/;
print Dumper(\@array);

my $arr = \@array;

system("perl secondary_script.pl $arr") ;

print "END\n";
Run Code Online (Sandbox Code Playgroud)


secondary_script.pl

#!/usr/bin/perl

my @var = @{$ARGV[0]};
print @var."\n";
Run Code Online (Sandbox Code Playgroud)

我正在传递数组引用作为secondary_script.pl往返于该数组的参数。在这里@var打印0结果,而不是通过传递的数组内容primary_script.pl

将数组作为参数传递给另一个perl脚本的这种正确方法吗?

arrays perl perlscript

1
推荐指数
1
解决办法
56
查看次数

将结果数据附加到 Parallel::ForkManager Perl 中的标量变量

我有一个代码,它按预期工作。但是我很难将每个执行命令的输出存储在$result = $ssh->capture($command_to_execute);. 这使用Parallel::ForkManager模块通过使用不同的文件作为输入参数在不同的主机中运行命令。

命令执行完成后,我希望结果输出应存储在$result变量中。它应该将每个主机结果附加到相同的变量中,最后我想处理$result. 我正在使用.=将结果数据附加到$result但它似乎没有工作。

在这里粘贴我的代码以供参考:

.
.
.
my $result;
my $pm = Parallel::ForkManager->new(5);

DATA_LOOP:
foreach my $n (1..$num_buckets) {
        my $pid = $pm->start and next DATA_LOOP;

        $command_to_execute = $my_command." ".$Files{$n};
        my $ssh = SSH_Connection( $list_of_ips[$n-1], 'username', 'pass' );
        $result = $ssh->capture($command_to_execute);
        $result .= "Result from File:$Files{$n} and Host:$list_of_ips[$n-1] is $result\n"; 
        print "Result: INSIDE: $result";
        $pm->finish;
}
$pm->wait_all_children;
print "Result: OUTSIDE: $result";
print "Done\n";

sub SSH_Connection …
Run Code Online (Sandbox Code Playgroud)

parallel-processing perl append

1
推荐指数
1
解决办法
81
查看次数

如果文件不存在,则从目录中删除文件时的 Perl 警告

我正在尝试从目录中删除旧的日志文件。

这里的逻辑是,如果 LOG 目录不存在,则创建它;否则从之前创建的 LOG 目录中删除文件。

...
use autodie;
my $logpath = "/home/Vinod/Test/LOG/";
if ( !-d $logpath ){
    make_path $logpath or die "Failed to create path: $logpath";
} else {
    unlink glob "$logpath/*.log";
}
...
Run Code Online (Sandbox Code Playgroud)

因此,当目录已创建且为空时,我收到以下警告 -

Can't unlink():  at script.pl line 41
Run Code Online (Sandbox Code Playgroud)

当目录已存在且为空时,如何避免出现此警告消息。TIA。

perl

1
推荐指数
1
解决办法
72
查看次数

如果发生 VM 硬件升级,已安装的 Perl 模块将被清除

我的 VM 版本是:Red Hat Enterprise Linux 6而 Perl 版本是This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi.

由于我必须执行一些使用模块的 Perl 脚本,例如Time::PieceTime::Seconds我的 VM 不断抛出错误消息,模块尚未安装。错误信息是:

$ perl -MTime::Piece -e 1
Can't locate Time/Piece.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .).
Run Code Online (Sandbox Code Playgroud)

所以正如文档中提到的,我执行了sudo yum install perl-core解决我在 VM 中的模块依赖问题的命令。

现在我的问题是,如果假设虚拟机升级到最新的硬件版本(例如,升级RHEL 6RHEL 7),使用的模块perl-core是否会被删除。

这个问题与VM更相关,因此也包括Linux标签。

perl redhat

1
推荐指数
1
解决办法
92
查看次数

在 Perl 中按顺序打印哈希键

我有哈希数组,需要迭代并打印序列中的值 - id,name,mailid

但是当我打印按键的内容时,它一直在打乱。如何打印如下内容:

ID,NAME,EMAIL
vkk,Victor,vkk@test.com
smt,Smith,smt@test.com
Run Code Online (Sandbox Code Playgroud)

这是我的脚本:

my @data = (
            { 
                'mail' => 'vkk@test.com',
                'name' => 'Victor',
                'id' => 'vkk'
            },
            { 
                'name' => 'Smith',
                'mail' => 'smt@test.com',
                'id' => 'smt'
            }
);

print "ID,NAME,EMAIL\n"; #header

for $content (@data){
    for $fields (keys %$content){
        print $content->{$fields}.",";
    }
    print "\n";
}
Run Code Online (Sandbox Code Playgroud)

perl hash

1
推荐指数
1
解决办法
120
查看次数

Perl 从数组元素中删除空格

我有一个包含n多个元素的数组。所以每个元素都有可能在开头或结尾有空格。所以我想一次性删除空间。这是我的代码片段,它可以工作,哪些不工作(不工作的代码片段能够在最后修剪,但不能从元素的正面修剪)。

不工作:

....
use Data::Dumper;

my @a = ("String1", " String2 ", "String3 ");

print Dumper(\@a);

@a = map{ (s/\s*$//)&&$_}@a;

print Dumper(\@a);
...
Run Code Online (Sandbox Code Playgroud)

在职的:

...
use Data::Dumper;

my @a = ("String1", " String2 ", "String3 ");

print Dumper(\@a);

my @b = trim_spaces(@a);

print Dumper(\@b);

sub trim_spaces
{
    my @strings = @_;
    s/\s+//g for @strings;
    return @strings;
}
...
Run Code Online (Sandbox Code Playgroud)

不知道这两者有什么区别。

如果有更好的请分享给我!!

arrays perl

0
推荐指数
1
解决办法
257
查看次数

在我的父 Perl 脚本中包含另一个脚本

如何在我的基本 Perl 脚本中包含另一个 Perl 脚本?

\n\n

我有一个主要源文件test.pl,我想config.pl在其中包含辅助 s\xc3\xb3urce 文件。

\n\n

在 Perl 中实现此目的的标准方法是什么?

\n

perl include

-1
推荐指数
1
解决办法
2193
查看次数