2017-02-08 13 views
0
use URI; 
my $url = new URI("ssh://[email protected]/path/to/file.txt"); 
print "User: ", $url->user, "\n"; 
print "Host: ", $url->host, "\n"; 
print "Path: ", $url->path, "\n"; 

output>>> 
    User: 
    Host: username 
    Path: /path/to/file.txt 

expected output>>> 
    User: username 
    Host: host 
    Path: /path/to/file.txt 

Другой примерКласс URI Perl неправильно анализирует информацию о пользователе | Важность строгого и предупреждения в Perl

use URI; 
my $url = new URI("ssh://[email protected]/path/to/file.txt"); 
print $url->as_string; 

output>>> 
ssh://username/path/to/file.txt 

Это явно ошибка не так ли? Но никто, кажется, не беспокоит! Никто не сообщил об этой ошибке в https://rt.cpan.org/Public/Dist/Display.html?Name=URI. Я попытался сообщить об этом, но у вас есть учетная запись с битной карточкой.

Что вы используете в своем случае? Простое регулярное выражение?

Что я использую?

  • Perl версия: v5.10.1 версия
  • URI: 1,37
+5

Ваш код работает для меня, когда я избегаю '@' или использую одинарные кавычки. – simbabque

+1

Обратите внимание, что вы можете сообщать об ошибках для Perl и основных модулей (в которых нет URI), не делая учетную запись с RT с помощью утилиты ['perlbug'] (http://perldoc.perl.org/perlbug.html), которая поставляется с Perl. – simbabque

+2

@simbabque И вы можете отправлять билеты для неосновных модулей, отправив электронное письмо на адрес 'bug- <имя-распространения> @ rt.cpan.org', например. 'Ошибка-URI @ rt.cpan.org'. – ThisSuitIsBlackNot

ответ

6

URI в порядке.

Это очень хороший пример того, почему вы всегда должны use strict и use warnings.

use URI; 
my $url = new URI("ssh://[email protected]/path/to/file.txt"); 
print $url->user, $url->host, $url->path; 

__END__ 
username/path/to/file.txt 

С strict.

use strict; 
use URI; 
my $url = new URI("ssh://[email protected]/path/to/file.txt"); 
print $url->user, $url->host, $url->path; 

__END__ 
Global symbol "@host" requires explicit package name at /home/simbabque/code/scratch.pl line 1739. 
Execution of /home/simbabque/code/scratch.pl aborted due to compilation errors. 

И теперь с use warnings сверху.

use strict; 
use warnings; 
use URI; 
my $url = new URI("ssh://[email protected]/path/to/file.txt"); 
print $url->user, $url->host, $url->path; 

__END__ 
Possible unintended interpolation of @host in string at /home/simbabque/code/scratch.pl line 1740. 
Global symbol "@host" requires explicit package name at /home/simbabque/code/scratch.pl line 1740. 
Execution of /home/simbabque/code/scratch.pl aborted due to compilation errors. 

Это довольно ясно, что здесь не так. Perl считает, что @host является переменной, потому что у вас есть это в двойных кавычках "".

Возможная непреднамеренное интерполяция @host в строке

либо избежать его, используя "user\@host" или одиночные кавычки '' как '[email protected]'.

+0

Спасибо, что я понял, после публикации вопроса и смеха вслух ... – Samiron

9

Вот хороший пример того, почему вы должны ВСЕГДА use strict;use warnings;:

Возможный непреднамеренного интерполяции @host в строка

Это означает, что вы на самом деле не отправляете то, что думаете, что отправляете. Попробуйте print ING его, и вы получите:

ssh://username/path/to/file.txt 

Который не то, что вы думаете, вы посылаете.

#!/usr/bin/perl 

use warnings; 
use strict; 
use URI; 

my $url = URI->new("ssh://username\@host/path/to/file.txt"); 
print "User: ", $url->user, "\n"; 
print "Host: ", $url->host, "\n"; 
print "Path: ", $url->path, "\n"; 

Однако, дает желаемый результат.

Примечание. Я изменил линию new, потому что new URI является косвенным обозначением объекта, а URI->new - лучший стиль.

+0

И тогда мы заканчиваем тем, что писали почти одно и то же: D – simbabque

+0

Какой я должен принять: P – Samiron

+0

@simbabque: Я не думаю, что уместно обсуждать голосование или принятие в комментариях или подразумевать, что * быстрее лучше *. – Borodin