私はしばしばデバッグのために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`;