1

私は 13 歳で Perl を学ぼうとしています。これが私の最初のスクリプトの 1 つです。このリンクにより、ユーザーは画像をダウンロードする Web ページに移動します。注意深い人は、リンクの末尾が .png であることに気付くかもしれません。これは、URL の画像を指定します。このスクリプトを実行すると、Chrome が開き、URL が開きますが、拡張子 .png を含めることができません。私の質問は次のとおりです。

A) なぜこれが起こっているのですか? B)誰かが代替案を提案したり、スクリプトを修正したりできますか.

スクリプトは以下にあります。

#!/usr/bin/perl

print "Type Username Here:
";

$username = <>;

print "Link: http://s3.amazonaws.com/MinecraftSkins/$username.png
";

exec "start www.s3.amazonaws.com/MinecraftSkins/$username.png";

助けてください!!!

4

3 に答える 3

4

データをキャプチャすると、その末尾にある新しい行もキャプチャされます。

これにより、以下が得られます。

exec "start www.s3.amazonaws.com/MinecraftSkins/EXAMPLE
.png";

これを回避するには、入力したデータの末尾から空白を削除します。

$username =~ s/\s+$//;

また

chomp($username);
于 2013-04-29T16:55:46.743 に答える
3

$username入力プロンプトで「Enter」を押したときにヒットしたキャリッジリターンが含まれるため、exec 呼び出しは実際には 2 つの別々のコマンドのように見えます。

start www.s3.amazonaws.com/MinecraftSkins/$username
.png

chomp($username)その空白を取り除こうとします。

于 2013-04-29T16:55:59.150 に答える
2

入力の最後に改行を追加する必要があります。

#!/usr/bin/perl

print "Type Username Here:
";

chomp ( $username = <> );

print "Link: http://s3.amazonaws.com/MinecraftSkins/$username.png
";

exec "start www.s3.amazonaws.com/MinecraftSkins/$username.png";

次の方法で変数をサニタイズできます(サンプルとしてユーザー入力に文字、数字、および/または文字アンダースコアのみが含まれていることを確認してください)。_

#!/usr/bin/perl

print "Type Username Here:
";

$username = $1 if <> =~ /^([a-z0-9_]*)$/i;

print "Link: http://s3.amazonaws.com/MinecraftSkins/$username.png
";

exec "start www.s3.amazonaws.com/MinecraftSkins/$username.png";

より良い書き方(@KeithThompsonのコメントとして):

#!/usr/bin/perl

print "Type Username Here:
";

if ( <> =~ /^([a-z0-9_]*)$/i ) {

    $username = $1
    print "Link: http://s3.amazonaws.com/MinecraftSkins/$username.png\n";

    exec "start www.s3.amazonaws.com/MinecraftSkins/$username.png";
} else {

    print "Error input contain invalid characters\n";

};
于 2013-04-29T16:57:45.377 に答える