2013-06-17 3 views
1

У меня есть код perl, который генерирует HTML-отчет. После завершения выполнения программы я хочу запустить html-браузер.Не удается открыть браузер в программе perl?

for (i<0; $i<$#files; $i++) { 

    if (condition is met) { 

     &sub_pass(prints to html file) 

    } 
    else { 
     &sub_fail(prints to html file) 
    } 

} 

    my @url_report = "C://path/to/htmlfile/"; 
    system("explorer @url_report"); 

Но это не запускает html-файл, я хочу. Когда я вызываю функцию System перед циклом for, он успешно открыл файл. Любая причина или решение и как я могу заставить его работать?

+1

проверить файл ':: Spec' Perl модуль, как обращаться с портативными файловые пути ... :) – jm666

+1

' explorer' не является веб-браузер. 'iexplore' (если вы хотите запустить только Internet Explorer) – n0rd

+1

Пожалуйста, не вызывайте подпрограммы с помощью' & '. Это не требуется в течение очень долгого времени. –

ответ

4

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

my $url_report = "C:\\path\\to\\htmlfile\\"; 
system("explorer $url_report"); 
2

переменной url_report здесь является массивом, а не скаляр:

my @url_report = "C://path/to/htmlfile/"; 
system("explorer @url_report"); 

Вы можете попробовать изменить это из массива на скаляр, и вы можете также использовать возможности извлекать сообщение об ошибке от system():

my $url_report = "C://path/to/htmlfile/"; 
system("explorer $url_report") == 0 or die "could not open file: $url_report ($?)"; 

более подробное сообщение об ошибке поможет вам устранить дальше.

+1

Из-за правил интерполяции массива, это должно передать одну и ту же строку в 'system'. Конечно, использование скаляров - это лучший стиль, но это не должно быть источником проблемы. Тем не менее, +1 для обработки ошибок – amon

0
"C://Users/path/output.html/" 

должен быть

"C:\\Users\\path\\output.html" 

Хотя это можно explorer принимает следующее (так как ядро ​​делает):

"C:/Users/path/output.html" 

Было бы еще лучше, если вы использовал браузер пользователя, s выбор:

my $url_report = "C:\\Users\\path\\output.html"; 
system(qq{start "" "$url_report"}); 
+0

'start' - это не программа, а внутренняя команда' cmd', поэтому 'system' не сможет ее запустить. Вместо этого вы должны вызвать cmd: 'system (qq {cmd/c start" $ url_report "});' – n0rd

+0

фактически, 'start' - это программа и находится в' c: \ windows \ system32 \ start.exe \ '.. – Massa

+0

@ n0rd, это неправильно по трем причинам. 1) 'start '$ url_report" 'запустит консоль под названием' C: \ path \ to \ htmlfile', но фактически не будет запускать что-либо, кроме 'cmd' в этой консоли. Вы не должны удалить второй аргумент. 2) Когда вы передаете один аргумент 'system', это команда оболочки. 'start" "" C: \ path \ to \ htmlfile "- это прекрасная команда оболочки. Не имеет значения, что он вызывает внутреннюю команду. 3) Даже если бы я использовал множественный аргумент для 'system', который не должен выполнять такие вещи, как внутренние команды, такие как' dir' и 'start', это все равно! – ikegami

Смежные вопросы