问题讨论:程序 C/C++ Java GUI编程 ASP Php Shell Perl Web开发 软件工程 三大件 机箱 存储设备 光存储 音频设备 视频设备 外设 购机
asp php java C CGI .net vb delphi unix|linux sql Word Excel WPS OutLook Powerpoint Dreamweaver FPage/Golive CSS/HTML DOM/JS
热门词:流程图 excel 入侵检测 vss Windows 安全漏洞 QQ空间 事件编程 MFC

 程序设计交流 > Perl 

readdir函数返回值是空串

[2007-11-14 21:46:41] [来源: 百家电脑学院] [我要投稿]

2007-9-26 17:40marscld
readdir函数返回值是空串

请教一下,首先使用opendir打开目录句柄,成功。
接着读取目录中的文件名集合,可是得到的却是和目录下内容等数量的空串,即 文件名 eq '';

Code:

opendir( DIR, $directory ) or die "open dir error";

    my $number = 0;
    while(defined($name = readdir (DIR))) {
            $number++;
            if($name eq "") {
                    print "Value -$name* is null string."
            }
            print "Loop $number-->$name**\n";
            next if $name eq "." || $name eq "..";
            next unless $name =~ /(.*)\.lip$/;       
           
            push @names, $name;
    }

如果目录下有5个文件,那么读出的是7项''。为何无法读到文件名呢?

[ 本帖最后由 marscld 于 2007-9-26 17:48 编辑 ]

2007-9-26 17:59royalzhang
哦,明白了,你是说你的@names为什么为空是吧?
你的这行:
next unless $name =~ /(.*)\.lip$/;  [/quote]
把下面的push都无效了……说明你的目录里没有.lip结尾的文件啊。

[ 本帖最后由 royalzhang 于 2007-9-26 18:05 编辑 ]
2007-9-26 18:02perljoker
我这里的测试结果是你print "Loop..."那里完全正常,包括了.. 和 .
然后你的@names里面如果都为空,是否因为next unless $name =~ /(.*)\.lip$/;   
把该句注释掉,才能运行push,你尝试检查你的正则表达式

2007-9-26 18:07Lonki
next unless $name =~ /(.*)\.lip$/;

跳过不是.lip结尾的文件?

写成 next if !~ 多好.....

2007-9-26 18:50perljoker
回复 #4 Lonki 的帖子

嗯,貌似只是单个$name,用next if $name !~ /\.lip$/就行
而且按我理解楼主的意思,大概这样写才能得到你想要的
以下内容为程序代码:
print "Loop $number-->$name**\n";
          next if $name eq "." || $name eq "..";
          push @names,$name if $name !~ /\.lip$/;        

2007-9-26 19:45marscld
回复 #5 perljoker 的帖子

不好意思,我没有描述明白。
程序的意思是要收集目录中以".lip"结尾的文件名字,实际目录中包含有这样的文件。
问题在于,每次
$name = readdir (DIR)
语句的执行结果都是''

麻烦帮忙分析下。谢谢。

2007-9-26 19:51marscld
这里启动了apache,通过下列方式访问Perl文件
例如: http://localhost/test/mytest.pl.

如果直接在Linux下执行,会成功。然而,通过http访问,会失败。

2007-9-26 20:05doiob
权限问题吧

2007-9-26 20:05perljoker
[quote]原帖由 marscld 于 2007-9-26 19:45 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7405815&ptid=996554][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
不好意思,我没有描述明白。
程序的意思是要收集目录中以".lip"结尾的文件名字,实际目录中包含有这样的文件。
问题在于,每次
$name = readdir (DIR)
语句的执行结果都是''

麻烦帮忙分析下。谢谢。


不好意思,对于网络的,我不懂,请教其他强人

至于你的结果为什么不对,我很困惑,因为我用自己电脑测试是通过的,结果都显示了的
如果你要收集.lip结尾的,只需要把我写的那个 push @names,$name if $name !~ /\.lip$/;
改成 push @names,$name if $name =~ /\.lip$/;
也就是!~改成=~就可以了

$directory ,你那里不知道会不会出在这个上面,我测试的时候,使用了"/."来代替你的$directory
其他爱莫能助了

2007-9-26 20:40marscld
回复 #9 perljoker 的帖子

多谢了

2007-9-26 23:40royalzhang
修改一下你的目录的权限,让其它用户可读。

2007-9-27 09:48marscld
用'ls -l'命令输出目录的内容,可以得到所有的文件信息列表,不过每次的 readdir 都取得空。


   my $ls_result = `ls -l ./`;
    print "------ls result: $ls_result###";

[ 本帖最后由 marscld 于 2007-9-27 09:50 编辑 ]

本篇来自:百家学院 (http://www.9php.com),转载请保留此行.

·看过 readdir函数返回值是空串 文章的还看过:

·百家学院 | 最新评论·

评论内容:不能少于5个字,请自觉遵守互联网相关政策法规。

用户名: 验证码: 验证码,看不清楚?请点击刷新验证码