Есть ли способ проверить, передается ли аргумент в одинарных кавычках? - PullRequest
4 голосов
/ 06 июня 2011

Есть ли (лучший) способ проверить, был ли $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; 

Ответы [ 2 ]

12 голосов
/ 06 июня 2011

Вы не можете; bash анализирует кавычки перед передачей строки в интерпретатор Perl.

4 голосов
/ 07 июня 2011

Расширить ответ Благовеста ...

perl program <a href="http://example.com/foo?bar=23&thing=42" rel="nofollow">http://example.com/foo?bar=23&thing=42</a> интерпретируется оболочкой как:

  1. Выполнить perl и передать ему аргументы program и http://example.com/foo?bar=23
  2. Заставьте его работать в фоновом режиме (вот что означает &)
  3. Интерпретировать thing=42 как установку переменной среды thing, равную 42

Вы должны были увидеть ошибку вроде -bash: thing: command not found, но в этом случае bash интерпретировал thing=42 как правильную инструкцию.

Оболочка обрабатывает цитирование, и Perl не знает об этом. Perl не может выдать сообщение об ошибке, он просто видит аргументы после обработки оболочки. Он даже не видит &. Это одна из тех вещей Unix, с которыми вам придется научиться жить. Оболочка - это полноценная среда программирования, в лучшую или в худшую сторону.

Существуют и другие оболочки, которые немного заглушают вещи, так что вы можете избежать этой проблемы, но на самом деле вам лучше изучить причуды и возможности настоящей оболочки.

...