Я не знаю, почему аргумент opendir является незаконным - PullRequest
1 голос
/ 07 января 2020
This is perl 5, version 30, subversion 1 (v5.30.1) built for MSWin32-x64-multi-thread
Win10
cygwin

Я не могу понять, как использовать opendir. Вот мой пример кода:

sub test($) {
   my $dir     = shift;
   opendir (DIR, $dir) || die "Couldn't open dir $dir $!";
}
sub main() {
   my $dir = `pwd`;
   test($dir);
}

Сообщение об ошибке

Couldn't open dir /home/skidmarks/Projects/Perl
 Invalid argument at ./test.py line .

pwd возвращает путь к каталогу в формате unix ('/'). Я пробовал это с windows отформатированный путь к каталогу ('\'). Единственное, что работает, - это использование буквальной строки для пути, например, "." или "some_directory_path".

Не могу ли я использовать переменную в opendir для пути?

Ответы [ 3 ]

7 голосов
/ 07 января 2020

qx * ​​1002 * (backticks) также возвращает символ новой строки, поэтому вам нужно chomp $dir;.

Еще лучше, почему бы не использовать возможности Perl

use Cwd qw(cwd);

my $dir = cwd;

, и теперь вам не нужно беспокоиться о системных командах и о том, как именно они возвращаются.


Поскольку это выполняется с cygwin, даже после перевода строки получаемый путь является путем unix в стиле, и это может привести к конфликтам (как сообщается при открытии файла). Использование Windows сборки Perl позволит избежать таких проблем или использовать инструмент для преобразования путей, например cygpath. См этот пост

0 голосов
/ 07 января 2020

Последняя версия Cygwin была установлена ​​и протестирована со слегка измененным кодом - работает нормально.

ПРИМЕЧАНИЕ: pwd - это команда Linux / UNIX, которая выдает ошибку в MS Windows, но работает в Cygwin, которая эмулирует среду Linux / UNIX (двоичная несовместима, требует перекомпиляции программ)

#!/usr/bin/perl

use strict;
use warnings;

use feature 'say';

sub test($) {
   my $dir = shift;

   opendir(my $dh, $dir)
        or die "Couldn't open dir $dir $!";

   map{ say } readdir($dh);

   close $dh;
}

sub main() {
   my $dir = `pwd`;
   chomp $dir;

   print "[$dir]\n";

   test($dir);
}

main();

Функция main не требуется в perl (функция main () C / C ++ точка входа) и обычно код выглядит следующим образом

#!/usr/bin/perl

use strict;
use warnings;

use feature 'say';

my $dir = `pwd`;          # pwd is UNIX/Linux command will give an error in MS Windows

chomp $dir;               # trim \n at the end of $dir

say "DIRECTORY: [$dir]";  # Let's check what we got

test($dir);

sub test {
   my $dir = shift;

   opendir(my $dh, $dir)
        or die "Couldn't open dir $dir $!";

   map{ say } readdir($dh);

   close $dh;
}
0 голосов
/ 07 января 2020

Попробуйте следующий фрагмент кода, он хорошо работает с Strawberry perl.

Также попробуйте поставить полный путь в двойные кавычки "c:\Program Files\Common Files".

Если имя каталога не указано, сценарий выведет список текущий каталог

Использование: perl script.pl "C:\Users\User_name"

use strict;
use warnings;

use feature 'say';

my $dir_name = shift || '.';

opendir(my $dir, $dir_name)
    or die "Couldn't open $dir_name";

map{ say } readdir($dir);

closedir $dir;

ПРИМЕЧАНИЕ. Перейдите в Cygwin терминал целевой каталог и команда выдачи pwd. Perl скрипт, запущенный в Cygwin, возможно, будет ожидать путь в этой форме.

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