4

$uri一重引用符で渡されたかどうかを確認する(最良の)方法はありますか?

#!/usr/local/bin/perl
use warnings;
use 5.012;

my $uri = shift;
# uri_check
# ...

私の問題をより明確にするために、この例を追加しました。

#!/usr/local/bin/perl
use warnings;
use 5.012;
use URI;
use URI::Escape;
use WWW::YouTube::Info::Simple;
use Term::Clui;

my $uri = shift;
# uri check here

$uri = URI->new( $uri );
my %params = $uri->query_form;
die "Malformed URL or missing parameter" if $params{v} eq '';
my $video_id = uri_escape( $params{v} );

my $yt = WWW::YouTube::Info::Simple->new( $video_id );
my $info = $yt->get_info();

my $res = $yt->get_resolution();
my @resolution;
for my $fmt ( sort { $a <=> $b }  keys %$res ) {
    push @resolution,  sprintf "%d : %s", $fmt, $res->{$fmt};

}

# with an uri-argument which is not passed in single quotes 
# the script doesn't get this far

my $fmt = choose( 'Resolution', @resolution );
$fmt = ( split /\s:\s/, $fmt )[0];
say $fmt; 
4

2 に答える 2

12

できません; bash は、文字列が Perl インタープリターに渡される前に引用符を解析します。

于 2011-06-06T09:13:52.420 に答える
4

Blagovestの答えを拡張するには...

perl program http://example.com/foo?bar=23&thing=42シェルによって次のように解釈されます。

  1. 実行perlして引数を渡しprogramhttp://example.com/foo?bar=23
  2. バックグラウンドで実行する(という&ことです)
  3. thing=42環境変数thing42

次のようなエラーが表示されるはずです-bash: thing: command not foundが、この場合、bashthing=42は有効な命令として解釈されました。

シェルは引用符を処理しますが、Perl はそのことを知りません。Perl はエラー メッセージを発行できません。シェル処理後に引数が表示されるだけです。&. _ これは、一緒に暮らすために学ばなければならない Unix の機能の 1 つにすぎません。シェルは、良くも悪くも完全なプログラミング環境です。

この問題を回避できるように、物事をかなり馬鹿にするシェルが他にもありますが、実際には、実際のシェルの癖と力を学ぶ方が良いでしょう.

于 2011-06-06T20:49:52.973 に答える