小编oli*_*erg的帖子

Perl OR条件

我有一个具有许多这样的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)

在这种情况下,我需要添加许多其他变量,从而使该行有点不可读。

我想知道是否有一种更优雅的方式来指定它们,也许使用某种数组/列表?

谢谢

perl conditional-statements

4
推荐指数
2
解决办法
64
查看次数

Getopt::Long 和 GetOptions 中的子程序

是否有可能将参数传递给通过 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 中会更好,如果可能的

谢谢

perl arguments

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

Perl XML::LibXML 用法

我在使用 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)

xml perl loops libxml2 xml-libxml

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

使用Try :: Tiny和Module :: Runtime使用try-catch时,避免使用Perl中的警告

我有这个代码目前在我的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)

perl module runtime try-catch

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

包中的 Perl 子例程用于修改其外部的哈希值

总结一下:

  • 我有一个主脚本,里面有一个哈希值
  • 这个主脚本调用一个包,其中我有一个子例程,我想从中修改这个全局哈希的内容(向其中添加元素)

这是我放入 /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)

perl reference

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

PHP 多个 OR 在 if 条件下

如果我的用户具有执行操作的必要权限,但我的条件不起作用,我正在尝试检查我的 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 (||) 放在一起,但它失败了。

我想说的是:

  1. 如果用户没有“ADMIN”或“MANAGEMENT”权限($SESSION['roles']数组中的值)
  2. 或者如果用户不是请求者($requester应该与$_SESSION['tnumber']

然后他应该有一条消息说他不被允许。

否则(如果他有 ADMIN 权限,或 MANAGEMENT 权限,或者他是请求者),那么它应该可以工作。

我怎样才能改变我的条件来满足这个要求?

感谢和问候!

php if-statement conditional-statements

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

使用Perl模块时的最佳实践

我基本上是模块的新手,我试图在我的脚本中使用它们.我无法找到正确使用它们的正确方法,我想了解你的建议.

让我快速解释一下我要做的事情:

我的脚本正在根据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)

xml perl module libxml2 xml-libxml

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

数据库设计(自定义属性取决于另一个属性)- MySQL 或其他

我有一个关于数据库建模的问题。

我有一个包含项目/系统的简单数据库(参见下面的示例)

每个系统都有一个主表,其中包含系统 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)

mysql database oracle database-design relational-database

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

变量名中的变量替换

我有数百行这样的行,其中只有变量名称发生变化(它们都具有相同的值)

# 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)

perl

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

在 Perl 中将所有数据结构转换为大写

我想知道是否有一种简单的方法可以将完整的数据结构(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)

感谢您的任何提示!

perl

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