AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-268886

BugBuddy's questions

Martin Hope
BugBuddy
Asked: 2019-12-18 12:59:32 +0800 CST

Perl - 不是 HASH 引用或不能使用字符串(“...”)作为 HASH 引用,而使用“严格引用”

  • 1

我正在学习 Perl。我可以使用示例数据使用这样的 Perl 哈希数据结构来迭代 JSON 集合。但是,实际数据包含一些导致错误Not a HASH reference或Can't use string ("...") as a HASH ref while "strict refs" in use.

这是给我带来麻烦的问题数据的简化示例:

{
    "0y7vfr1234": {
        "username": "[email protected]",
        "password": "some-random-password123",
        "uri": "ww1.example.com",
        "index": 14
    },
    "v2rbz1568": {
        "username": "[email protected]",
        "password": "some-random-password125",
        "uri": "ww3.example.com",
        "index": 29
    },
    "active": "0y7vfr1234",
    "0zjk1156": {
        "username": "[email protected]",
        "password": "some-random-password124",
        "uri": "ww2.example.com",
        "index": 38
    },
    "logging": {
        "active": true
    }
}

我只关心具有uri. 我想跳过其他的。我该怎么做?

在尝试了许多不起作用的事情(并且只会导致新的或不同的错误)之后,这就是我最终解决错误的方法。但是,我认为有比使用ref().

#!/usr/bin/perl
use JSON;
use utf8;
use Data::Dumper;
use strict; use warnings;

my $data = '{
        "0y7vfr1234": {
            "username": "[email protected]",
            "password": "some-random-password123",
            "uri": "ww1.example.com",
            "index": 14
        },
        "v2rbz1568": {
            "username": "[email protected]",
            "password": "some-random-password125",
            "uri": "ww3.example.com",
            "index": 29
        },
        "active": "0y7vfr1234",
        "0zjk1156": {
            "username": "[email protected]",
            "password": "some-random-password124",
            "uri": "ww2.example.com",
            "index": 38
        },
        "logging": {
            "active": true
        }
    }';

my $json = decode_json($data);

foreach my $key (keys %$json) {

    if ( ref( $json->{$key} ) !~ m/HASH/ ) {
            print "[" . ref( $json->{$key} ) . "]: skipping\n";
            next;
    }

    if ( ! exists $json->{$key}->{uri} ) {
        print "Not a server. It's type is:  [" . ref($json->{$key}) . "]\n";
        print "Without curly braces: $json->$key\n";
        print Dumper($json->{$key});
        print "With curly braces: $json->{$key}\n";
        next;
    }

    print "checking $json->{$key}->{uri}\n";
    # do some other stuff
}

代码或多或少按原样工作,但我对它不满意......或者我对它的理解。

我的问题是:

  1. 什么是迭代像我的 JSON 这样的“混合”数据而不遇到错误的正确方法?
  2. 显示有关我跳过的元素的一些信息的好方法是什么?我在代码中尝试了各种东西(数据转储器、不带花括号的打印等),但没有一个令人满意。有没有更好的方法可以显示有关已跳过内容的信息(当然不会导致错误)?
  3. 为什么上面的代码$json->{$key}->{uri}在没有这样的箭头的情况下也能工作:$json->{$key}{uri}?

我在 Linux 上使用 perl 5,版本 30。

linux perl
  • 1 个回答
  • 4224 Views
Martin Hope
BugBuddy
Asked: 2019-12-17 20:34:56 +0800 CST

如何在哈希而不是数组上使用 Perl grep?

  • 1

我正在学习 Perl。我已经能够grep在数组上使用并且语法非常简单,比如这个例子:

use strict; use warnings;

my @names = qw(Foo Bar Baz);
my $visitor = <STDIN>;
chomp $visitor;
if (grep { $visitor eq $_ } @names) {
   print "Visitor $visitor is in the guest list\n";
} else {
   print "Visitor $visitor is NOT in the guest list\n";
}

但是,我想知道是否有一种同样简单的方法可以grep在 hash 上使用而无需编写循环来遍历 hash 中的每个项目。

这是我正在使用的结构的一些示例数据。在分配 URI 之前,我想检查是否有任何项目已经具有该 uri 值。例如,我想分配ww1.example.com给 item v2rbz1568,但前提是没有其他项目的 uri 值为ww1.example.com。我怎样才能在 Perl 中有效地做到这一点?

{
    "0y7vfr1234": {
        "username": "[email protected]",
        "password": "some-random-password123",
        "uri": "ww1.example.com",
        "index": 14
    },
    "v2rbz1568": {
        "username": "[email protected]",
        "password": "some-random-password125",
        "uri": "ww3.example.com",
        "index": 29
    },
    "0zjk1156": {
        "username": "[email protected]",
        "password": "some-random-password124",
        "uri": "ww2.example.com",
        "index": 38
    }
}

我在 Linux 上使用 perl 5,版本 30。

perl
  • 1 个回答
  • 3199 Views
Martin Hope
BugBuddy
Asked: 2019-12-17 19:22:38 +0800 CST

在 Perl 而不是 Bash 中执行这些 shell 操作有意义吗?

  • 0

我正在学习 Perl。我有一个简单的应用程序,它由一个围绕 Perl 脚本的 bash 脚本包装器组成。我正在考虑摆脱 Bash 脚本并在 Perl 中完成所有操作(作为学习练习)。

我已经看到至少三种从 Perl 调用系统命令的不同方式:反引号exec()和system().

我想知道哪个是首选。我已阅读:

Perl 的 exec() 函数和 system() 函数都执行系统 ​​shell 命令。最大的区别在于 system() 创建了一个 fork 进程并等待查看命令是成功还是失败——返回一个值。exec() 不返回任何内容,它只是执行命令。这些命令都不应该用于捕获系统调用的输出。如果您的目标是捕获输出,则应使用反引号运算符。

对于我的示例代码(如下),我应该混合使用这些类型的系统调用,还是保持简单并使用反引号?

其次,我想知道是否建议将我的 bash 脚本包装器的功能移动到我的 Perl 脚本中。例如,如果我在工作中做这样简单的事情,我是否会因为一个由两种不同语言的两个脚本组成的实现而受到批评,或者我是否会因为在 Perl 中做一些可以很容易地完成的事情而受到批评?重击?还是“我喜欢什么”?

#!/bin/bash

rm myfile.zip >/dev/null 2>&1
wget https://downloads.example.com/myfile.zip
if [[ $? -ne 0 ]]; then
        echo "ERROR: failed to download list from example.com."
        exit 1
fi

current_date=$(date +"%Y-%m-%d")
read -p "Save current input as input_$current_date.json then press Enter key to continue."
echo

current_datetime=$(date +"%Y-%m-%d_%H%M")
mylist="mylist_$current_datetime.txt"

zipinfo -1 myfile.zip | sed 's|myfile_xyz/||' | grep '^me' | sed 's/.top.myfile//'  > $mylist

perl myperlscript.pl $mylist "input_$current_date.json"

bash是我系统上的默认 shell,所以除非另有说明,否则 Perl 将使用它。我不关心对其他系统或其他 shell 的可移植性。

bash shell-script
  • 1 个回答
  • 329 Views
Martin Hope
BugBuddy
Asked: 2019-12-17 18:46:46 +0800 CST

如何在 Perl 中迭代 JSON 对象集合(不是数组)?

  • 0

我正在学习 Perl。当对象包含在数组中时,我已经能够成功地遍历 JSON 集合。但是,我无法理解如何处理对象不在数组中并且具有事先不知道的0y7vfr1234随机标识符(例如)的 JSON 数据。这是我尝试读取、更新并保存回文件的结构的一些示例数据。

{
    "0y7vfr1234": {
        "username": "[email protected]",
        "password": "some-random-password123",
        "uri": "ww1.example.com",
        "index": 14
    },
    "v2rbz1568": {
        "username": "[email protected]",
        "password": "some-random-password125",
        "uri": "ww3.example.com",
        "index": 29
    },
    "0zjk1156": {
        "username": "[email protected]",
        "password": "some-random-password124",
        "uri": "ww2.example.com",
        "index": 38
    }
}

如果这些对象都在一个数组中,我会这样做:

#!/usr/bin/perl

use lib qw(..);
use JSON;
binmode STDOUT, ":utf8";
use utf8;
use strict;
use warnings;

my $filename1 = 'input.json';
my $filename2 = 'serverlist.txt';

my $json_text = do {
open(my $json_fh, "<:encoding(UTF-8)", $filename1)
    or die("Can't open \$filename1\": $!\n");
local $/;
<$json_fh>
};

open my $server_list, '<', $filename2 or die "Can't open $filename2: $!";
my @server_list = <$server_list>;
close $server_list or die "Can't close $server_list: $!";

my $json = JSON->new;
my $data = $json->decode($json_text);

my $aref = $data->{the_array_name};

for my $setting (@$aref) {
    if (length $setting->{uri}) { #no warnings
        $setting->{uri} =~ m/^ww(\d+)\.example.com/;
        my $server_number = $1;
        print "checking $server_number ... \n";
        if (grep{/$setting->{uri}/} @server_list) {
            print "server number is:  $server_number\n";
        } else {
            # 1. iterate through the sorted list
            foreach (@server_list)
            {
                $_ =~ m/^ww(\d+)\.example.com/;
                my $new_num = $1;
                # 2. find the next match in order
                if ( $new_num > $server_number ) {
                    print "Found it: new server number $new_num is greater than $server_number\n";
                    # TODO 3. check that it does not exist in $data->{the_array_name};

                    # 4. replace $setting->{uri} with new value
                    my $new_server = $_;
                    $new_server =~ s/\s+$//;
                    $setting->{uri} = $new_server;
                    last;
                }
            }
        }
    }
}

# 5. save JSON as a file to disk.
my $filename3 = 'output.json';
open my $proxy_settings, '>', $filename3 or die "Can't open $filename3: $!";
print $proxy_settings encode_json($data);
close $proxy_settings or die "Can't close $proxy_settings: $!";

这是我写的第一个 Perl。我还没有 100% 理解它的每一行。(例如:)binmode STDOUT, ":utf8";。我确信它远非最佳,我会继续努力。我的问题是,如何修改它以使用上面显示的 JSON 结构?

我在 Linux 上使用 perl 5,版本 30。

linux files
  • 1 个回答
  • 3647 Views
Martin Hope
BugBuddy
Asked: 2019-11-11 22:27:29 +0800 CST

如何在 bash 脚本中使用 sgdisk 分区来确定大小

  • 0

我在类似于以下的 bash 脚本中使用 sgdisk:

sgdisk --clear /dev/vda --set-alignment=1 --new 1:34:2047 --typecode 1:EF02 -c 1:"grub"  -g /dev/vda
sgdisk --new 2:2048:16779263 --typecode 2:8300 -g /dev/vda
sgdisk --new 3:16779264:20971486 --typecode 3:8200 -g /dev/vda

这仅在设备事先众所周知并且扇区是硬编码的情况下才有效。

我想删除扇区值的硬编码。相反,我希望脚本在脚本运行之前不知道磁盘大小时工作。分区 1 制作完成后,我会留出一个已知的固定数量给分区 3 进行交换,剩下的给分区 2。

简单的方法是创建交换分区#2。我知道该怎么做。但是,我想看看是否可以在保持交换分区 3 的同时执行此操作。这意味着 sgdisk 必须计算分区 2 的大小或结束扇区值,同时考虑下一步将分配给分区 3 的大小。

阅读 sgdisk 手册页并没有给我有关如何执行此操作的线索(或者即使可以完成)。

bash
  • 1 个回答
  • 714 Views
Martin Hope
BugBuddy
Asked: 2018-12-19 13:40:26 +0800 CST

如何将每N个字符的换行符插入一个长字符串[重复]

  • 17
这个问题在这里已经有了答案:
如何在长行中每四个字符插入一个空格? (8 个回答)
3年前关闭。

使用常见的 bash 工具作为 shell 脚本的一部分,我想每隔 N 个字符重复插入一个换行符('\n')到一个长字符串中。

例如,给定这个字符串,我如何每 20 个字符插入一个换行符?

head -n 50 /dev/urandom | tr -dc A-Za-z0-9

我试图达到的结果示例:

ZL1WEV72TTO0S83LP2I2
MTQ8DEIU3GSSYJOI9CFE
6GEPWUPCBBHLWNA4M28D
P2DHDI1L2JQIZJL0ACFV
UDYEK7HN7HQY4E2U6VFC
RH68ZZJGMSSC5YLHO0KZ
94LMELDIN1BAXQKTNSMH
0DXLM7B5966UEFGZENLZ
4917Y741L2WRTG5ACFGQ
GRVDVT3CYOLYKNT2ZYUJ
EAVN1EY4O161VTW1P3OY
Q17T24S7S9BDG1RMKGBX
WOZSI4D35U81P68NF5SB
HH7AOYHV2TWQP27A40QC
QW5N4JDK5001EAQXF41N
FKH3Q5GOQZ54HZG2FFZS
Q89KGMQZ46YBW3GVROYH
AIBOU8NFM39RYP1XBLQM
YLG8SSIW6J6XG6UJEKXO

一个用例是快速制作一组随机密码或固定长度的 ID。我做上面例子的方式是:

for i in {1..30}; do head /dev/random | tr -dc A-Z0-9 | head -c 20 ; echo ''; done

但是,出于学习目的,我想以不同的方式进行。我想从一个任意长的字符串开始并插入换行符,从而将一个字符串分成多个固定字符长度的小字符串。

bash shell-script
  • 4 个回答
  • 9008 Views
Martin Hope
BugBuddy
Asked: 2018-07-22 18:31:38 +0800 CST

如何为 TAP 设备制作 netctl 配置文件?

  • 1

寻求netctl为水龙头设备制作配置文件。这是我收到的有关连接的信息。

GATEWAY=192.168.117.1  
DNS=192.168.117.1  
BROADCAST=255.255.255.255 **or** 192.168.117.255 (*I was given both of these different values*)  
PREFIX=31  
STATIC IP ADDRESS=192.168.117.2/24  
TYPE=TAP  

Netctl 包含一些示例。我使用了我发现的一个examples/tuntap:

Description='Example tuntap connection'
Interface=tun0
Connection=tuntap
Mode='tun'
User='nobody'
Group='nobody'

## Example IP configuration
#IP=static
#Address='10.10.1.2/16'

这是我想出的个人资料:

Description='My tap connection'
Interface=tap0
Connection=tuntap
Mode='tap'
User='nobody'
Group='nobody'
IP=static
Address='192.168.117.2/24'
UsePeerDNS=true
DefaultRoute=true
SkipDAD=yes
DHCPReleaseOnStop=yes

问题

  • 我需要指定广播地址或网关吗?
  • 是否需要前缀(什么是前缀 31)?
  • 还有什么我忽略的吗?
networking configuration
  • 1 个回答
  • 732 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve