Как я могу заставить разветвленные каналы работать в Perl на Windows? - PullRequest
5 голосов
/ 11 февраля 2009

Я пытаюсь перенести сценарий Perl с Unix на Windows, но практически не могу заставить его работать из-за неподдерживаемых разветвлений в функции open. Вот код:

sub p4_get_file_content {
    my $filespec = shift;
    return 'Content placeholder!' if ($options{'dry-run'});
    debug("p4_get_file_content: $filespec\n");
    local *P4_OUTPUT;
    local $/ = undef;
    my $pid = open(P4_OUTPUT, "-|");
    die "Fork failed: $!" unless defined $pid;
    if ($pid == 0) { # child
        my $p4 = p4_init();
        my $result = undef;
        $result = $p4->Run('print', $filespec);
        die $p4->Errors() if $p4->ErrorCount();
        if (ref $result eq 'ARRAY') {
            for (my $i = 1; $i < @$result; $i++) {
                print $result->[$i];
            }
        }
        $p4->Disconnect();
        exit 0;
    }
    my $content = <P4_OUTPUT>;
    close(P4_OUTPUT) or die "Close failed: ($?) $!";
    return $content;
}

Ошибка:

'-' is not recognized as an internal or external command,
operable program or batch file.

Кто-нибудь знает, как заставить это работать? Спасибо!

Mike

Ответы [ 2 ]

5 голосов
/ 11 февраля 2009

Я знаю, что это не прямой ответ на ваш вопрос, но похоже, что вы пишете что-то поверх Perforce в Perl? Если это так, вы можете найти, что существующая библиотека делает то, что вы уже хотите, и избавить себя от многих головных болей, или, по крайней мере, дать вам пример кода для работы.

Например:

РЕДАКТИРОВАТЬ : Теперь, когда я знаю, что вы делаете, я предполагаю, что вы пытаетесь перенести p42svn на Windows или, по крайней мере, сделать его совместимым с Windows по крайней мере. См. в этой теме для обсуждения этой конкретной проблемы. Рекомендация (не проверенная) состоит в том, чтобы попробовать примеры кода, перечисленные в http://perldoc.perl.org/perlfork.html в разделе " Forking pipe open (), еще не реализованном ", чтобы вместо этого явно создать канал.

1 голос
/ 11 февраля 2009

Это не будет работать как есть. Вам нужно будет найти другой метод, чтобы выполнить то, что он делает. Не похоже, что есть необходимость в форк-трубе, но трудно сказать, так как я не знаю, что такое p4, и большая часть вашего кода теряется при интерпретации угловых скобок.

...