小编Bio*_*Rod的帖子

理解Perl中的引用

我正在尝试理解Perl中的引用教程

perldoc perlreftut
Run Code Online (Sandbox Code Playgroud)

到目前为止,使用下面的代码,我正在初始化一个空哈希

my %table
Run Code Online (Sandbox Code Playgroud)

这是整个计划

#!/usr/bin/perl -w 
use strict;

my %table;

while (<DATA>) {
chomp;
my ($city, $country) = split /, /;
#$table{$country} = [] unless exists $table{$country};
push @{$table{$country}}, $city;

print @{$table{$country}};
}



__DATA__
Chicago, USA
Frankfurt, Germany
Berlin, Germany
Washington, USA
Helsinki, Finland
New York, USA
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释下面这一行,因为我很困惑,因为我在这里看到一个引用(我认为),但它被初始化为带有%table的哈希.

push @{$table{$country}}, $city;
Run Code Online (Sandbox Code Playgroud)

perl

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

了解perl中的数据结构

我正在尝试理解perldsc文档中的"常见错误"部分.当他提到时,作者试图传达的是什么:

构造像数组数组之类的两个最常见的错误是意外地计算元素的数量,或者重复引用相同的内存位置.在这种情况下,您只需获取计数而不是嵌套数组:

for my $i (1..10) {
    my @array = somefunc($i);
    $AoA[$i] = @array;      # WRONG!
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,当它迭代时,它将取第一个值(1..10),即1,并将它传递给这样的函数:

my @array = somefunc(1);
Run Code Online (Sandbox Code Playgroud)

由于没有定义该函数,我将创建逻辑.

sub somefunc  {
my $a = shift;
print $a * $a;
}
Run Code Online (Sandbox Code Playgroud)

这基本上会这样做:

1 * 1
Run Code Online (Sandbox Code Playgroud)

结果是'1'.

根据我的理解,我的@array看起来像:

@array = ('1');
Run Code Online (Sandbox Code Playgroud)

下一行将做:

$AoA[$i] = @array;
Run Code Online (Sandbox Code Playgroud)

我假设$ AoA [$ 1]是一个匿名数组(他/她没有用'my',btw声明)而@array将是这个匿名数组的第一个元素,作者说它'错了.并为每个循环迭代到'2'.

somefunc(2);
Run Code Online (Sandbox Code Playgroud)

这将是'4'并传递给:

$AoA[$i] = @array
Run Code Online (Sandbox Code Playgroud)

使用此代码的作者有什么意义呢?我试图理解错误,但更重要的是,我正在努力理解代码.任何帮助将不胜感激.

UPDATE

我想我明白为什么这是一个常见的错误,因为当我使用print和Dumper时,我可以直观地看到作者试图传达的内容,这里是修改后的代码.

#!/usr/bin/perl -w
use strict;
use Data::Dumper;

for my $i (1..10) {
           my @AoA;
           my @array = somefunc($i);
           print "The array …
Run Code Online (Sandbox Code Playgroud)

perl

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

了解数组数组

我将在Array of Arrays的部分中查看perldsc的文档,它显示了一个数组数组的样子

@AoA = (
    [ "fred", "barney" ],
    [ "george", "jane", "elroy" ],
    [ "homer", "marge", "bart" ],
  );
Run Code Online (Sandbox Code Playgroud)

在第1-4行的下一节中,它将展示如何生成一个

# reading from file
  while ( <> ) {
 push @AoA, [ split ];
}
Run Code Online (Sandbox Code Playgroud)

我想学习如何创建一个.我创建了一个文件并在其中包含以下内容.

约翰亚当乔

罗德弗雷德詹姆斯

艾莉森弗兰克让

然后我使用示例中的代码创建了一个数组数组

#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my @AoA;

while ( <> ) {
 push @AoA, [ split ];
 }

print Dumper(@AoA);
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,Dumper的内容是

$VAR1 = [
      'John',
      'Adam',
      'Joe'
    ];
$VAR2 = [
      'Rod',
      'Fred',
      'James'
    ];
$VAR3 = …
Run Code Online (Sandbox Code Playgroud)

perl

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

在python脚本中perl one liner

我有一个perl one衬里,在特定行的末尾添加一个字符串,当我在主机上运行一个衬里时它就可以工作.例如,我想在'AllowUsers'开头的行末尾附加'boy857sr xxxxxxx'

perl -pi.bak -e 's/^(AllowUsers.*)/\1 boy857sr xxxxxxx/g;' /etc/ssh/sshd_config
Run Code Online (Sandbox Code Playgroud)

完美的工作!

AllowUsers boy857bt soladmin svc-Orion_SAM solarw boy857lj boy806nk boy806sk   boy857sr xxxxxxx
Run Code Online (Sandbox Code Playgroud)

但是当我在python脚本中运行它时,它会清除'AllowUsers'行并添加另一行,如下所示:

#RSAAuthentication yes
^A kn857sr xxxxxxx
Run Code Online (Sandbox Code Playgroud)

这是python脚本.

import pxssh

my_list=[
"server121"
]


for i in my_list:
    s = pxssh.pxssh(timeout=15, maxread=2000000)
    s.SSH_OPTS += "-o StrictHostKeyChecking=no"
    s.SSH_OPTS += "-o UserKnownHostsFile=/dev/null"
    s.login(i,'username','password')
    print (i)

    s.sendline('/usr/local/bin/sudo su -')
    s.expect('Password: ')
    s.sendline('xxxxxxx')

    s.prompt()
    print s.before
    s.sendline('perl -pi.bak -e \'s/^(AllowUsers.*)/\1 boy857sr xxxxxxx/g;\' 
/etc/ssh/sshd_config')
    s.prompt()
    print s.before

    s.sendline('exit')
    s.logout()
Run Code Online (Sandbox Code Playgroud)

python perl

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

Azure Devops 中缺少克隆按钮

我的任务是将存储库从 Azure Devops 移动到 Bitbucket 服务器。我对 Azure DevOps 非常陌生。当我访问 Azure 中的存储库时,我注意到我可以将存储库下载为 zip 文件,但没有克隆选项。我下载了 zip 文件,当我尝试解压缩该文件时,收到以下消息:

unzip: can't find file table
Run Code Online (Sandbox Code Playgroud)

解压缩过程将无法成功完成。有人可以向我解释为什么我无法从 Azure Devops 解压缩文件,或者告诉我为什么缺少“克隆”选项吗?

在此输入图像描述

azure tfvc azure-devops

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

带请求的POST XML文件

我越来越:

<error>You have an error in your XML syntax...
Run Code Online (Sandbox Code Playgroud)

当我运行此python脚本时,我刚刚写过(我是新手)

import requests

xml = """xxx.xml"""

headers = {'Content-Type':'text/xml'}

r = requests.post('https://example.com/serverxml.asp', data=xml)

print (r.content);
Run Code Online (Sandbox Code Playgroud)

这是xxx.xml的内容

<xml>
<API>4.0</API>
<action>login</action>
<password>xxxx</password>
<license_number>xxxxx</license_number>
<username>xxx@xyz.com</username>
<training>1</training>
</xml>
Run Code Online (Sandbox Code Playgroud)

我知道xml是有效的,因为我为perl脚本使用了相同的xml,并且内容被打印回去。

任何帮助将不胜感激,因为我是python的新手。

python python-requests

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

提取变量并将其添加到单独的XML文件中

我有一个可以登录并返回会话ID的脚本。我需要会话ID,以便可以填充XML文件来处理它,例如,为苗圃创建工厂房间。

#!/usr/bin/perl -w

use strict;

use LWP::UserAgent;
use Data::Dumper;
use XML::Simple;

my $authenticate = do {
    open my $fh, '<', '/tmp/login.xml' or die "Could not open file: $!";
    local $/;
    <$fh>;
};

my $webpage = "https://www.example.com/api";

my $ua = LWP::UserAgent->new;
my $response = $ua->post($webpage, Content_Type => 'text/xml',
                                        Content => $authenticate);


if ( $response->is_success) {

    my $xml = new XML::Simple;
    my $x = $response->decoded_content;

    # read XML file
    my $data = $xml->XMLin($x);

    my $sessionid =  $data->{'sessionid'};

...
Run Code Online (Sandbox Code Playgroud)

我需要使用该sessionid变量并将其插入另一个如下所示的xml文件中:

<xml>
  <API>4.0</API>
  <action>plant_room_add</action> …
Run Code Online (Sandbox Code Playgroud)

xml perl

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

在大文件中搜索 IP 地址数组

我有一个大约 400MB 的大型网络文件。我有大约 11 个 IP 地址的数组。

我需要在整个文件中搜索这 11 个 IP 地址,但我的 Perl 脚本无法正常工作。我已将 IP 地址放入数组中,但不确定是否要为数组的每个元素打开文件,反之亦然。

#!/usr/bin/perl
use warnings;
use strict;

my @leaflogicservers = qw/
xx.117.189.181
xx.117.191.238
xx.117.185.80
xx.117.184.255
52.xxx.52.29
52.xxx.52.183
52.xxx.52.184
52.xxx.52.185
52.xxx.52.186
40.xxx.190.72
40.xxx.11.156
/;

my $PathToFile = 'router01.log';

open my $router01, '<', "$PathToFile" or die $!;


while ( my $ip = <$router01> ) {
chomp($ip);
for my $catch ( @leaflogicservers ) {
chomp($catch);


if ( $catch =~ m/$ip/ ) {
print "Caught!\n";
}
}
}
Run Code Online (Sandbox Code Playgroud)

perl

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

标签 统计

perl ×6

python ×2

azure ×1

azure-devops ×1

python-requests ×1

tfvc ×1

xml ×1