AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-268886

BugBuddy's questions

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

Perl - Não é uma referência HASH ou não pode usar string ("...") como uma ref HASH enquanto "referências estritas" em uso

  • 1

Estou aprendendo Perl. Eu sou capaz de iterar sobre uma coleção JSON usando uma estrutura de dados de hash Perl como esta usando dados de amostra. No entanto, os dados reais contêm alguns elementos que estão causando o erro Not a HASH referenceou Can't use string ("...") as a HASH ref while "strict refs" in use.

Aqui está um exemplo simplificado de dados problemáticos que estão me causando problemas:

{
    "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
    }
}

Estou preocupado apenas com os elementos de dados que têm uma extensão uri. Eu quero pular os outros. Como eu faria isso?

Depois de tentar dezenas de coisas que não funcionaram (e só levaram a erros novos ou diferentes), aqui está como eu finalmente contornei os erros. No entanto, suponho que há uma maneira muito melhor de fazer isso do que usar o 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
}

O código funciona mais ou menos como está, mas não estou feliz com ele... ou com minha compreensão dele.

Minhas perguntas são:

  1. Qual é a maneira correta de iterar dados "mistos", como meu JSON, sem encontrar erros?
  2. Qual é uma boa maneira de exibir algumas informações sobre os elementos que eu pulo? Tentei várias coisas no código (Data Dumper, impressão sem chaves, etc.) e nenhuma delas é satisfatória. Existe uma maneira melhor de mostrar informações sobre o que foi ignorado (sem causar um erro, é claro)?
  3. Por que o código acima $json->{$key}->{uri}também funciona sem a seta assim: $json->{$key}{uri}?

Estou usando perl 5, versão 30 no Linux.

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

Como usar o Perl grep em um hash em vez de um array?

  • 1

Estou aprendendo Perl. Eu consegui usar grepem um array e a sintaxe é muito simples, como este exemplo :

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";
}

No entanto, gostaria de saber se existe uma maneira igualmente simples de usar grepem um hash sem codificar um loop para percorrer cada item no hash .

Aqui estão alguns dados de exemplo com a estrutura com a qual estou trabalhando. Antes de atribuir um URI, quero verificar se algum item já possui esse valor de uri. Por exemplo, quero atribuir ww1.example.coma item v2rbz1568, mas somente se nenhum outro item tiver um valor uri de ww1.example.com. Como posso fazer isso com eficiência em 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
    }
}

Estou usando perl 5, versão 30 no Linux.

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

Faz sentido fazer essas operações de shell em Perl em vez de Bash?

  • 0

Estou aprendendo Perl. Eu tenho um aplicativo trivial que consiste em um wrapper de script bash em torno de um script Perl. Estou pensando em me livrar do script Bash e fazer tudo em Perl (como um exercício de aprendizado).

Eu vi pelo menos três maneiras diferentes de chamar comandos do sistema de Perl: backticks exec()e system().

Gostaria de saber qual é o preferido. eu li :

Tanto a função exec() do Perl quanto a função system() executam um comando shell do sistema. A grande diferença é que system() cria um processo de bifurcação e espera para ver se o comando é bem-sucedido ou falha – retornando um valor. exec() não retorna nada, simplesmente executa o comando. Nenhum desses comandos deve ser usado para capturar a saída de uma chamada do sistema. Se seu objetivo é capturar a saída, você deve usar o operador backtick.

No caso do meu código de exemplo (abaixo), devo misturar esses tipos de chamadas de sistema ou apenas mantê-lo simples e usar acentos graves?

Em segundo lugar, gostaria de saber se é recomendável mover as funções do meu wrapper de script bash para meu script Perl. Por exemplo, se eu estivesse fazendo algo simples como isso no trabalho, eu poderia esperar ser criticado por uma implementação que consiste em dois scripts em duas linguagens diferentes, ou seria criticado por fazer coisas em Perl que poderiam ser facilmente feitas em Bash? Ou é "o que eu preferir"?

#!/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é o shell padrão no meu sistema, então é isso que o Perl usará, a menos que seja dito o contrário. Não estou preocupado com a portabilidade para outros sistemas ou outros shells.

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

Como iterar sobre a coleção de objetos JSON (não array) em Perl?

  • 0

Estou aprendendo Perl. Consegui iterar com sucesso em uma coleção JSON quando os objetos estavam contidos em uma matriz. No entanto, não consigo entender como trabalhar com dados JSON onde os objetos não estão em uma matriz e possuem identificadores aleatórios (por exemplo, 0y7vfr1234) que não são conhecidos antecipadamente . Aqui estão alguns dados de exemplo com a estrutura que estou tentando ler, atualizar e salvar em um arquivo.

{
    "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
    }
}

Se esses objetos estivessem todos dentro de um array, eu faria assim:

#!/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: $!";

Esse é o primeiro Perl que eu já escrevi. Eu não entendo cada linha dele 100% ainda. (Exemplo: binmode STDOUT, ":utf8";). Tenho certeza de que está longe de ser o ideal e continuarei trabalhando nisso. Minha pergunta é, como ele pode ser modificado para funcionar com a estrutura JSON mostrada acima?

Estou usando perl 5, versão 30 no Linux.

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

Como determinar tamanhos usando o particionamento sgdisk no script bash

  • 0

Estou usando o sgdisk em um script bash semelhante a este:

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

Isso funciona apenas quando os dispositivos são conhecidos antecipadamente e os setores são codificados.

Eu quero soltar o hardcode dos valores do setor. Em vez disso, quero que o script funcione quando o tamanho do disco não for conhecido até que o script seja executado. Depois de fazer a partição 1, vou separar uma quantia fixa conhecida para a partição 3 para troca e dar o resto para a partição 2.

A maneira mais fácil seria fazer a partição swap #2. Eu sei como fazer isso. No entanto, quero ver se posso fazer isso enquanto mantenho a troca na partição 3 . Isso significa que o sgdisk terá que calcular um tamanho ou valor de setor final para a partição 2 levando em consideração o tamanho que será alocado para a partição 3 na próxima etapa.

Ler a página de manual do sgdisk não me deu as pistas sobre como fazer isso (ou mesmo se isso pode ser feito).

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

Como inserir caracteres de nova linha a cada N caracteres em uma string longa [duplicado]

  • 17
Essa pergunta já tem respostas aqui :
Como insiro um espaço a cada quatro caracteres em uma linha longa? (8 respostas)
Fechado há 3 anos .

Usando ferramentas bash comuns como parte de um script de shell, quero inserir repetidamente um caractere de nova linha ('\n') em uma longa string em intervalos de cada N caracteres.

Por exemplo, dada esta string, como eu inseriria um caractere de nova linha a cada 20 caracteres?

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

Exemplo dos resultados que estou tentando alcançar:

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

Um caso de uso é criar rapidamente um conjunto de senhas ou IDs aleatórios de comprimento fixo. A maneira como eu fiz o exemplo acima é:

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

No entanto, para fins de aprendizado, quero fazê-lo de uma maneira diferente. Eu quero começar com uma string arbitrariamente longa e inserir novas linhas, quebrando assim uma string em várias pequenas strings de comprimento de caractere fixo.

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

Como fazer um perfil netctl para um dispositivo TAP?

  • 1

Buscando fazer um netctlperfil para um dispositivo de toque. Aqui está a informação que me foi dada sobre a conexão.

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 inclui alguns exemplos. Usei o que encontrei em 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'

Segue o perfil que criei:

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

Perguntas

  • Preciso especificar o endereço de broadcast ou gateway?
  • É necessário um prefixo (e o que é o prefixo 31)?
  • Há mais alguma coisa que eu tenha esquecido?
networking configuration
  • 1 respostas
  • 732 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve