【发布时间】:2017-08-11 07:42:46
【问题描述】:
例如:
#!/usr/bin/perl
...
my $host = $db_conf->{host};
my @cmd = ('date',$host);
system(@cmd);
所以我期待的结果是:
Fri Aug 11 15:41:28 CST 2017 db-test-1
以 db-test-1 为主机名。
这是我的全部代码:
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use DBI;
use Encode;
use IO::File;
use JSON;
use utf8;
BEGIN {
binmode STDERR, ':utf8';
binmode STDIN, ':utf8';
binmode STDOUT, ':utf8';
}
INIT {
my @databases = </kkcorp/kksecret/db-*/db.json>;
foreach my $filename (@databases) {
my $fh = IO::File->new($filename, 'r') or croak $!;
my @buf = <$fh>;
my $str = join '', @buf;
$fh->close;
my $db_conf = decode_json $str;
my $entry = int(rand(scalar(@{$db_conf})));
$db_conf = $db_conf->[$entry]->{writer}->{params};
my $host = $db_conf->{host};
my $dbname = $db_conf->{dbname};
my $password = $db_conf->{password};
my $username = $db_conf->{username};
my $wsrep_check = `mysql -h $host -u $username -p$password < /authdir/auto_inc_script.sql`;
$hosti
if (index($wsrep_check, 'Value: Synced') != -1) {
my @cmd = ('date ${host}');
system(@cmd);
my @wsrep_check_lines = split /\n/, $wsrep_check;
my @table_name = grep { /Synced/ } @wsrep_check_lines;
for my $line (@table_name){
say STDERR $line;
}
say '';
}
}
}
__END__
所以我想在“if”语句开始之后的两个语句中实现什么。代码运行良好,但忽略了 ${host} 变量,没有显示任何输出。
以下是我的结果:
Fri Aug 11 17:13:19 CST 2017
ok Value: Synced
Fri Aug 11 17:13:20 CST 2017
ok Value: Synced
【问题讨论】:
-
开启
use strict;use warnings;。检查错误的内容。发布一些输出。发布更多细节,因为我们不知道 db_conf 是什么。但我很确定你的system命令是错误的,因为date localhost错误与invalid date。 -
我已经添加了完整的代码,并详细解释了我想要实现的目标。
-
您的
my @cmd = ('date ${host}');有单引号,因此${host}不会被插值。后面的system运行date ${host}。这不是你想要的,对吧?除此之外,我从mysql ..中的描述中不明白问题出在哪里? -
当我使用双引号而不是单引号时,我收到错误“日期:无效日期...”
-
但是
date ${host}的意义何在?${host}是什么?它是否应该被插值,因为$host来自数据库?如果是,那么最好使用date命令所期望的日期格式。但是按照你的方式,你运行date,后跟一个(假定的)变量${host},它应该存在于你的环境中......真的吗?