Perlのファイルに「echo」htmlコンテンツを追加します。

Perlのファイルに「echo」htmlコンテンツを追加します。

私はしばしばデバッグのためにPerlで "echo $xxx >file"を使用します。見苦しくてシンプルで、「これを行う方法はいくつかあります」という原則に従います。

しかし、今質問があります@_@_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>'

これが可能かどうか知りたいです。

PS:bashをテストしましたが、端末で動作します。

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

しかし、Perlはできません。

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

私はこれを行うためのいくつかのトリックがあると思います。

答え1

あ、いいえ。バックティックを使用して行うことは、ファイルに何かを印刷するためのシェルを作成することだけです。ご存知のように、特殊文字は問題を引き起こします。コマンドの注入を許可します。。理論的には、シェルが特別だと考えるすべてを避けることができますが、そうすることは面倒です。

正しいファイル処理関数を使用し、すべてのステップを含む関数を生成してください。

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

すべてを入力したくない場合は、エラーチェックとすべてのもの(最初のバージョンなど)を無視して、より見苦しいものに圧縮できます。または、フルバージョンをモジュールに保存し、Perlのインクルードパス(バラより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;

使用:

perl -MDumptofile -e 'dumptofile("out.txt", "blahblah");

答え2

見つけました。すみません、私は厄介なPerlが好きです...

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

思い出させてくれてありがとう、ラケシュ・シャルマ。私のコードをこれに変更しました。

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

関連情報