我有一个具有许多这样的OR条件的代码(工作正常),以检查其中一个值是否为空,然后抛出错误消息(必须填充所有值)
} elsif (
!$params{'account'}
|| !$params{'type'}
|| !$params{'sampledate'}
|| !$params{'lastpwchange'}
|| !$params{'system'}
|| !$params{'wspass'}
) {
print $cgi->header("text/plain"), "some mandatory parameters are missing";
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我需要添加许多其他变量,从而使该行有点不可读。
我想知道是否有一种更优雅的方式来指定它们,也许使用某种数组/列表?
谢谢
是否有可能将参数传递给通过 getopt::long 调用的子程序?例如,当用户在命令行上指定script.pl -pandora 参数时,我有此代码调用 &Salt
GetOptions ( "domain=s" => \$domain,
"pandora=s" => \&Salt,
"reverse=s" => \$reverse,
"help" => \&Usage)
or die(&Usage);
Run Code Online (Sandbox Code Playgroud)
我如何获得要传递给 Salt 的参数?尝试了一些事情,例如:
GetOptions ( "domain=s" => \$domain,
"pandora=s" => \&Salt($pandora),
"reverse=s" => \$reverse,
"help" => \&Usage)
or die(&Usage);
Run Code Online (Sandbox Code Playgroud)
甚至
GetOptions ( "domain=s" => \$domain,
"pandora=s" => \&Salt($_[1]),
"reverse=s" => \$reverse,
"help" => \&Usage)
or die(&Usage);
Run Code Online (Sandbox Code Playgroud)
但它不会工作
我知道我可以通过做 => $pandora 来让它工作,然后在代码中使用一个条件 if ($pandora) { &Salt($pandora) } 但我会发现将 sub 直接放在 getOptions 中会更好,如果可能的
谢谢
我在使用 XML::LibXML 时遇到一些问题,我想知道是否有办法做我想做的事情,或者是否应该更改我的 XML。
目前,我的 XML 如下所示:
<fftg>
<actions>
<rename>
<mandatory>0</mandatory>
<other_things_here />
</rename>
<transfer>
<mandatory>0</mandatory>
<protocol>SFTP</protocol>
<other_things_here />
</transfer>
<transfer>
<mandatory>1</mandatory>
<protocol>FTP</protocol>
<other_things_here />
</transfer>
<archive>
<mandatory>1</mandatory>
<other_things_here />
</archive>
<rename>
<mandatory>1</mandatory>
<other_things_here />
</rename>
</actions>
</fftg>
Run Code Online (Sandbox Code Playgroud)
如您所见,在“actions”下,可以有不同类型的操作(每种操作有 1 个或多个操作,每个操作下有不同的内容)
我想浏览每个操作并根据该操作执行特定的操作。
我的问题是:由于存在多个同类操作,因此脚本无法正常工作并覆盖前一个同类操作,或者特定操作上的循环会在同类每个操作上重新循环
示例1:
foreach my $transfer ($doc->findnodes('/fftg')) {
# Browse Actions
foreach my $action ($doc->findnodes('/fftg/actions/*')) {
my $action_name = $action->nodeName();
my $actiontype = ucfirst($action->nodeName());
print "executing action $action_name ..\n";
# Browse action details
foreach my $action_details ($doc->findnodes('/fftg/actions/'.$action_name)) {
for …Run Code Online (Sandbox Code Playgroud) 我有这个代码目前在我的perl脚本的一部分(工作正常):
try {
no strict 'refs';
require_module $modules{$action_name};
if ( &{"FFTG::${actiontype}::run"}( $action, $fs, $log ) ) {
$log->res("SUCCESS");
} else {
if ( $action->{mandatory}[0] == 1 ) {
$log->res("FAIL, exiting.");
last ACTION;
} else {
$log->res("FAIL, but not mandatory, continuing..");
}
}
}
catch {
$log->res("MODULE NOT FOUND");
print "no module found for action '$actiontype', unable to process this action\n";
#warn $_;
};
Run Code Online (Sandbox Code Playgroud)
但不幸的是,脚本的输出在输出中间显示了这3个错误(所有行以Exiting子例程开头):
starting transfer ..
no module found for action 'Transfer', unable to process this action …Run Code Online (Sandbox Code Playgroud) 总结一下:
这是我放入 /tmp 中的代码的极其简化的提取,以说明我的问题:
主脚本(/tmp/nonstdtest.pl):
#!/usr/bin/perl
use lib '/tmp';
use TEST;
use Data::Dumper;
my %nonstd;
tNumber(\%nonstd);
print Dumper(\%nonstd);
Run Code Online (Sandbox Code Playgroud)
包(/tmp/TEST.pm):
package TEST;
use strict;
use warnings;
use Exporter;
our @ISA= qw( Exporter );
our @EXPORT_OK = qw( tNumber );
our @EXPORT = qw( tNumber );
sub tNumber {
my $nonstd = shift;
$nonstd = %$nonstd;
$nonstd{'example'} = 'test_here';
}
Run Code Online (Sandbox Code Playgroud)
问题,输出是:
Global symbol "%nonstd" requires explicit package name at /tmp/TEST.pm line 15.
Compilation failed in require at /tmp/nonstdtest.pl line 5. …Run Code Online (Sandbox Code Playgroud) 如果我的用户具有执行操作的必要权限,但我的条件不起作用,我正在尝试检查我的 PHP 代码。我可能误解了 AND/OR。请问我需要你的帮助吗?
实际上,我有:
if ( !in_array('ADMIN',$_SESSION['roles']) || !in_array('MANAGEMENT',$_SESSION['roles']) || $requester != $_SESSION['tnumber'] ) {
echo "you are not allowed to XXXX !";
} else {
// allowed
}
Run Code Online (Sandbox Code Playgroud)
我已经将这 3 个条件与 OR (||) 放在一起,但它失败了。
我想说的是:
$SESSION['roles']数组中的值)$requester应该与$_SESSION['tnumber']然后他应该有一条消息说他不被允许。
否则(如果他有 ADMIN 权限,或 MANAGEMENT 权限,或者他是请求者),那么它应该可以工作。
我怎样才能改变我的条件来满足这个要求?
感谢和问候!
我基本上是模块的新手,我试图在我的脚本中使用它们.我无法找到正确使用它们的正确方法,我想了解你的建议.
让我快速解释一下我要做的事情:
我的脚本正在根据XML文件中的数据进行一些文件传输.
所以基本上,我有XML文件,内容如下:
<fftg>
<actions>
<!-- Rename file(s) -->
<rename>
<mandatory>0</mandatory>
<file name="foo" to="bar" />
</rename>
<!-- Transfer file(s) -->
<transfer>
<mandatory>0</mandatory>
<protocol>SFTP</protocol>
<server>fqdn</server>
<port>22</port>
<file name="bar" remotefolder="toto" />
</transfer>
<!-- Transfer file(s) -->
<transfer>
<mandatory>0</mandatory>
<protocol>SFTP</protocol>
<server>fqdn</server>
<port>22</port>
<file name="blabla" remotefolder="xxxx" />
<file name="blabla2" remotefolder="xxxx" />
</transfer>
</actions>
</fftg>
Run Code Online (Sandbox Code Playgroud)
简而言之,我有一个执行"动作"的脚本.每个动作都可以重复X次.
现在,而不是一个重要的脚本与一堆子程序等..我认为为我的应用程序创建模块应该更好,并将操作放在模块中.
例如 :
FFTG::Rename
FFTG::Transfer
FFTG::Transfer::SFTP
FFTG::Transfer::FTP
Run Code Online (Sandbox Code Playgroud)
等等(我创建了所有这些模块,它们可以独立工作)
并根据XML文件中指定的操作调用这些模块.如果需要,人们可以创建新的模块/操作(我希望模块化).
现在,我不知道如何正确地做到这一点.
所以我的问题是:请问最好的方法是什么?
目前,我的脚本正在阅读这些动作:
# Load XML file
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file($FFTG_TSF . "/" . $tid …Run Code Online (Sandbox Code Playgroud) 我有一个关于数据库建模的问题。
我有一个包含项目/系统的简单数据库(参见下面的示例)
每个系统都有一个主表,其中包含系统 ID、名称、描述以及一些其他字段/属性。
每个系统可以具有某种“系统类型”(例如服务器、路由器、加密器等)。
我已将这些“类型”放入带有代码的单独表中(下面示例中的 systemtype_code )。
我想要实现的目标(它已经可以工作但不灵活)是:
例如,如果系统类型是“SSR”,我希望有“机架”、“机架位置”等字段。如果系统类型是“RTR”,我希望有“数字”等字段端口”、“系统日志服务器(包含其他项目的列表框)”等。
我想你明白了。
我设法用类似于下面的示例的方法来做到这一点(某些字段自然可以用于许多系统类型),但它非常简单。它工作得很好,但它是有限的,因为字段只能是一种类型(TEXT、VARCHAR 或其他类似的东西)。
所以我的问题是:
谢谢
这是我目前拥有的示例:
--------------------
table : systems
--------------------
sid
name
description
building_code
responsible_user
systemtype_code
--------------------
table : systemtypes
--------------------
systemtype_code
systemtype_name
--------------------
table : systemattrs
--------------------
systemattr_id
systemattr_name
--------------------
table : systemattrvalues
--------------------
sid
systemattr_id
systemattr_name
--------------------
table : l_systemattrs_systemtypes
--------------------
systemattr_id
systemtype_code
Run Code Online (Sandbox Code Playgroud)
要获取与系统相关的属性,我可以简单地进行如下查询:
SELECT a.systemattr_name,
v.systemattr_value
FROM systemattrs a,
systemattrvalues v,
systemtypes t,
l_systemattrs_systemtypes l
WHERE v.sid = 'MY_DESIRED_SYSTEM_ID'
AND l.systemattr_id = a.systemattr_id …Run Code Online (Sandbox Code Playgroud) 我有数百行这样的行,其中只有变量名称发生变化(它们都具有相同的值)
# no change required here
my $worksheet_stats = $workbook->add_worksheet('Stats');
my $worksheet_blockleave = $workbook->add_worksheet('Block Leave ');
my $worksheet_disabled = $workbook->add_worksheet('Disabled Users');
my $worksheet_past = $workbook->add_worksheet('EX Users');
# dirty (what i want to simplify without having to touch at the rest of the code as the script is huge)
$worksheet_blockleave->write( 0, 0, "GPN" );
$worksheet_blockleave->write( 0, 1, "Firstname" );
$worksheet_blockleave->write( 0, 2, "Lastname" );
$worksheet_blockleave->set_column( 0, 1, 30 );
$worksheet_blockleave->set_column( 0, 2, 30 );
$worksheet_disabled->write( 0, 0, "GPN" );
$worksheet_disabled->write( 0, …Run Code Online (Sandbox Code Playgroud) 我想知道是否有一种简单的方法可以将完整的数据结构(HoH/数组的混合)转换为大写?
例如,我有一个包含许多条目的结构,如下所示:
'oracle' => {
'sit' => {
'ZQ01-42P-PBTOKEN' => [
'ora:morningcheck',
'ora:simpana_bkp',
'ora:oraclepatching'
]
},
'prd' => {
'ZQ01-42P-PBTOKEN' => [
'ora:morningcheck',
'ora:simpana_bkp',
'odg:oraclepatching',
'ora:oraclepatching'
]
},
'uat' => {
'ZQ01-42P-PBTOKEN' => [
'ora:morningcheck',
'ora:simpana_bkp',
'odg:oraclepatching',
'ora:oraclepatching'
]
},
'PRD' => {
'ZQ01-42P-UXGROUP' => [
'socdbaud',
'oramgrp',
'wmioca',
'oramigration',
'tac'
]
Run Code Online (Sandbox Code Playgroud)
我想要 uc() 中的所有内容(键和值),有没有一种巧妙的方法可以做到这一点?
我尝试了这个,但失败了(之后我得到:'ORACLE'=>'HASH(0X2941738)')
%ds = map uc, %ds;
Run Code Online (Sandbox Code Playgroud)
感谢您的任何提示!