我正在尝试理解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) 我正在尝试理解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) 我将在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 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) 我的任务是将存储库从 Azure Devops 移动到 Bitbucket 服务器。我对 Azure DevOps 非常陌生。当我访问 Azure 中的存储库时,我注意到我可以将存储库下载为 zip 文件,但没有克隆选项。我下载了 zip 文件,当我尝试解压缩该文件时,收到以下消息:
unzip: can't find file table
Run Code Online (Sandbox Code Playgroud)
解压缩过程将无法成功完成。有人可以向我解释为什么我无法从 Azure Devops 解压缩文件,或者告诉我为什么缺少“克隆”选项吗?
我越来越:
<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的新手。
我有一个可以登录并返回会话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) 我有一个大约 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)