Слишком поздно для -CSD - PullRequest
5 голосов
/ 20 марта 2012

Попытка запустить эту маленькую Perl-программу из parsCit:

parsCit-client.pl e1.txt Слишком поздно для опции -CSD в строке [имя файла] 1

e1.txt здесь: http://dl.dropbox.com/u/10557283/parserProj/e1.txt

Я запускаю программу из win7 cmd, а не Cygwin.

имя файла parsCit-client.pl - вся программа здесь:

#!/usr/bin/perl -CSD
#
# Simple SOAP client for the ParsCit web service.
#
# Isaac Councill, 07/24/07
#
use strict;
use encoding 'utf8';
use utf8;
use SOAP::Lite +trace=>'debug';
use MIME::Base64;
use FindBin;

my $textFile = $ARGV[0];
my $repositoryID = $ARGV[1];

if (!defined $textFile || !defined $repositoryID) {
    print "Usage: $0 textFile repositoryID\n".
    "Specify \"LOCAL\" as repository if using local file system.\n";
    exit;
}

my $wsdl = "$FindBin::Bin/../wsdl/ParsCit.wsdl";

my $parsCitService = SOAP::Lite
    ->service("file:$wsdl")
    ->on_fault(
           sub {
           my($soap, $res) = @_;
           die ref $res ? $res->faultstring :
               $soap->transport->status;
           });

my ($citations, $citeFile, $bodyFile) =
    $parsCitService->extractCitations($textFile, $repositoryID);

#print "$citations\n";
#print "CITEFILE: $citeFile\n";
#print "BODYFILE: $bodyFile\n";

Ответы [ 2 ]

8 голосов
/ 20 марта 2012

С perldoc perlrun , о переключателе -C:

Примечание. Начиная с perl 5.10.1, если в "#!" Используется опция -C линия, это также необходимо указать в командной строке , так как стандарт потоки уже настроены на этом этапе выполнения Perl переводчик. Вы также можете использовать binmode () для установки кодировки ввода / вывода поток.

Что, вероятно, означает, что компилятор подразумевает "слишком поздно".

Другими словами:

perl -CSD parsCit-client.pl 
2 голосов
/ 13 марта 2016

Поскольку параметры командной строки в #! "shebang" не передаются согласованно во всех операционных системах (см. этот ответ ), и Perl уже открыл потоки перед синтаксическим анализом сценария shebang, и поэтомуне может компенсировать это в некоторых старых ОС, было решено в ошибка 34087 запретить -C в шебанге.Конечно, не все были довольны этим «исправлением», особенно если бы оно работало на их ОС, и они не хотят думать ни о чем другом, кроме UTF-8.

Если вы думаете binmode() уродлив и ненужен (и не охватывает аргументы командной строки), вы можете рассмотреть пакет utf8::all, который имеет эффект, аналогичный perl -CSDL.

Или если бы вы использовали * nix, я бы предложил export PERL_UNICODE="SDA" во включающем скрипте, чтобы Perl понял, что он находится в среде UTF-8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...