首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么opendir参数无效?

为什么opendir参数无效?
EN

Stack Overflow用户
提问于 2020-01-07 06:11:40
回答 3查看 335关注 0票数 1
代码语言:javascript
复制
This is perl 5, version 30, subversion 1 (v5.30.1) built for MSWin32-x64-multi-thread
Win10
cygwin

我不知道如何使用opendir。下面是我的示例代码:

代码语言:javascript
复制
sub test($) {
   my $dir     = shift;
   opendir (DIR, $dir) || die "Couldn't open dir $dir $!";
}
sub main() {
   my $dir = `pwd`;
   test($dir);
}

错误消息

代码语言:javascript
复制
Couldn't open dir /home/skidmarks/Projects/Perl
 Invalid argument at ./test.py line .

pwd返回unix格式的目录路径('/')。我尝试过使用windows格式的目录路径('\')。唯一有效的方法是对路径使用文字字符串,例如,“。或者"some_directory_path“。

我不能使用opendir中的变量作为路径吗?

EN

回答 3

Stack Overflow用户

发布于 2020-01-07 06:18:41

qx (反引号)也返回换行符,所以您需要使用chomp $dir;

更好的是,为什么不使用Perl的工具呢

代码语言:javascript
复制
use Cwd qw(cwd);

my $dir = cwd;

现在,您不必担心系统命令以及它们的确切返回方式。

因为OP使用来自cygwinpwd,所以即使换行符消失了,获得的路径也是unix样式的,这与Perl的MSWin32构建冲突(正如打开文件时所报告的那样)。使用可移植的工具(如上面的Cwd )和Windows构建的Perl应该可以避免这样的问题。

或者使用工具转换路径,如cygpath。请参阅this post

票数 6
EN

Stack Overflow用户

发布于 2020-01-07 07:38:00

尝试下面这段代码,它可以很好地与Strawberry perl配合使用。

还要尝试将完整路径放在双引号"c:\Program Files\Common Files"中。

如果未提供目录名,则脚本将列出当前的目录

用法:perl script.pl "C:\Users\User_name"

代码语言:javascript
复制
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。在Cygwin中运行的Perl脚本可能会得到以下形式的路径

票数 1
EN

Stack Overflow用户

发布于 2020-01-07 13:29:25

安装了最新版本的Cygwin,并使用稍微修改过的代码进行了测试--工作正常。

注:pwd是Linux/UNIX命令,它在MS Windows中产生错误,但在模拟Linux/UNIX环境的Cygwin中工作(二进制不兼容,需要重新编译程序)

代码语言:javascript
复制
#!/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++入口点),通常代码如下

代码语言:javascript
复制
#!/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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59619670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档