“echo” conteúdo html para arquivar em perl

0

Costumo usar "echo $ xxx > file" no perl, normalmente para depuração. É feio mas simples, cabe "Há mais de uma maneira de fazê-lo".

Mas agora tenho um problema com @_ . @_ contém uma página da web.

'echo "@_" >/tmp/curl';
'echo """@_""" >/tmp/curl';

sh: -c: line 5: syntax error near unexpected token '<'
sh: -c: line 5: ' <meta description="

'echo "'"@_"'" >/tmp/curl';
'echo '"'@_'"' >/tmp/curl';

sh: -c: line 0: syntax error near unexpected token 'newline'
sh: -c: line 0: 'echo "'"<html>'

Eu quero saber se isso pode ser feito ou não.

ps: Eu testei o bash, ele funciona no terminal.

r='<meta description="Ch<br><br>This'; echo $r >/tmp/curl

Mas o perl não pode.

#!/usr/bin/perl
$r='<meta description="Ch<br><br>This';
'echo "$r" >/tmp/curl'; exit;

Acho que aqui tem algum truque para fazer isso.

    
por utopic eexpress 06.04.2017 / 11:25

2 respostas

5

Oh querida, não. O que você está fazendo com os backticks é gerar um shell apenas para imprimir algo em um arquivo. Como você percebe, caracteres especiais causam problemas, e permitem a injeção de comandos . Em teoria, você poderia escapar de tudo que o shell considera especial, mas isso é chato de fazer.

Use apenas as funções adequadas de manipulação de arquivos e faça uma função para conter todas as etapas:

sub dumptofile($@) {
    my $file = shift;
    if (open F, ">", $file) {
        print F @_;
        close F; 
    } else {
        warn "Can't open $file: $!"
    }
}

dumptofile("/tmp/curl", "some output\n");

Agora, se você não quiser digitar tudo isso, pode condensá-lo em algo mais feio, ignorando a verificação de erros e tudo (como na minha primeira versão). Ou salve a versão completa em um módulo e coloque-a em algum lugar no caminho de inclusão do seu Perl ( veja perl -I ).

# Dumptofile.pm
package Dumptofile;
use strict;
use warnings;
use Exporter qw/import/;
our @EXPORT = qw/dumptofile/;

sub dumptofile($@) {
    my $file = shift;
    if (open my $fh, ">", $file) {
        print $fh @_;
        close $fh; 
    } else {
        warn "Can't open $file: $!"
    }
}
1;

use:

perl -MDumptofile -e 'dumptofile("out.txt", "blahblah");
    
por 06.04.2017 / 11:57
0

Eu encontrei. Desculpe eu gosto de perl sujo ....

'echo \'@_\' >/tmp/curl';

Obrigado por me lembrar, Rakesh Sharma. Eu mudo o código para isso.

push @_, 'that "is"you\'ok.'; 
for(@_){s/'/"/g;}; 'echo \'@_\' >/tmp/curl';
    
por 06.04.2017 / 14:06

Tags