我有一个 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) 我有一个脚本,它将根据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) 我有一个散列,其中包含如下数据:
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) 我有这个代码
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)
为什么在第一个场景中打印变量
我有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脚本的这种正确方法吗?
我有一个代码,它按预期工作。但是我很难将每个执行命令的输出存储在$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) 我正在尝试从目录中删除旧的日志文件。
这里的逻辑是,如果 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。
我的 VM 版本是:Red Hat Enterprise Linux 6而 Perl 版本是This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi.
由于我必须执行一些使用模块的 Perl 脚本,例如Time::Piece,Time::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 6到RHEL 7),使用的模块perl-core是否会被删除。
这个问题与VM更相关,因此也包括Linux标签。
我有哈希数组,需要迭代并打印序列中的值 - 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) 我有一个包含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)
不知道这两者有什么区别。
如果有更好的请分享给我!!
如何在我的基本 Perl 脚本中包含另一个 Perl 脚本?
\n\n我有一个主要源文件test.pl,我想config.pl在其中包含辅助 s\xc3\xb3urce 文件。
在 Perl 中实现此目的的标准方法是什么?
\n