2014-11-17 4 views
0

Я следующий код, который пытается записать содержимое в файл журнала:«не может открыть файл» для Perl под Cygwin

sub write_log 
{ 
    local($f) = "$log_dir/$log_file"; 
    $OUTPUT_FPATH = $f; 
    print "$OUTPUT_FPATH \n"; 
    open(OUTPUT_FPATH, ">$f") || 
    die "Error: cannot open output file '$f'\n"; 
} 

я могу видеть «OUTPUT_FPATH» точку в правильном месте, как

/cygdrive/c/mylog/verify.log. 

Я также использовал «эхо„тест“> /cygdrive/c/mylog/verify.log» в Cygwin консоли непосредственно, которая прекрасно справляется

Но почему я до сих пор получить «не могу открыть ....», когда Я запускаю скрипт perl?

И я уверен, что этот код проверен, так что может быть, я что-то делаю неправильно, правильно? или что еще это может быть?

прилагается простой пример, чтобы воспроизвести ошибку:

eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"[email protected]"}' 
& eval 'exec /usr/bin/perl -S $0 $argv:q' 
     if $running_under_some_shell; 


sub write_log 
{ 
local($f) = "/cygdrive/c/test/log.log"; 
$RT_OUTPUT_FH = $f; 
printf $f; 
open(RT_OUTPUT_FH, ">$f") || die "Error: cannot open output file '$f' \n"; 
} 


sub main 
{ 
    write_log("hahahaha"); 
} 

&main(); 

Та же ошибка с "!$" ->no such file or directory

в то время как он все еще работает, как это в Cygwin promopt

echo "hahahahahaha" > /cygdrive/c/test/log.log 
+1

Используйте переменную сообщения об ошибке '$!' В сообщении 'die', чтобы узнать, почему open не удается. Например. 'die" Невозможно открыть $ f: $! "' Вы также должны знать, что завершение сообщения 'die' с помощью новой строки' \ n' запрещает отображение номера строки в сообщении die. – TLP

+0

@TLP не получил такого файла или каталога .... – thundium

+0

Я не знаком с тем, как cygwin обрабатывает пути, но это кажется вероятным источником ошибки. – TLP

ответ

0

And I am sure this code is tested, so it could be me doing something wrong, access right? or what else can it be?

Проверьте, что perl invo ked действительно Perl от CygWin.

Ошибка, которую вы видите, имеет смысл только в том случае, если у вас есть, помимо CygWin, также встроенный Windows Perl.

Perg Perg понимает /cygdrive/ Пути - родной Windows Perl нет.

Чтобы рассказать друг другу, попробуйте, например, system("ls /"): CygWin и Windows имеют разное понимание корневого каталога (и Windows не имеет команды ls).