Perl文件测试运算符帮助
发布时间:2020-12-15 23:23:14 所属栏目:大数据 来源:网络整理
导读:这是一个非常基本的问题,但我是perl的新手,无法解决问题所在.我只是想隔离目录中的文件,但-d运算符会将所有文件夹内容视为文件… @contents是我的数组,当我运行它时: use strict;if ($ARGV[1]) { die("Error: You can only monitor one directory at a time
这是一个非常基本的问题,但我是perl的新手,无法解决问题所在.我只是想隔离目录中的文件,但-d运算符会将所有文件夹内容视为文件…
@contents是我的数组,当我运行它时: use strict; if ($ARGV[1]) { die("Error: You can only monitor one directory at a timen"); } my $directory = $ARGV[0] || die "Error: No directory definedn"; opendir(DIR,$directory) || die "Error: Can't open dir $directory: $!"; my @contents = readdir(DIR); foreach my $item(@contents) { if (-d $item) { next; } print"$item is a filen"; } closedir (DIR); 我一直收到文件夹和文件.或者,如果我使用-f,我什么也得不到. 编辑:这是输出 – file01.txt is a file folder 01 is a file folder 02 is a file Screen shot 2010-04-18 at 1.26.17 PM.png is a file 我在OSX上运行它 编辑:dir ls -l输出: aaron ~/Documents/test: ls -l total 112 -rw-r--r--@ 1 aaron staff 51235 18 Apr 13:26 Screen shot 2010-04-18 at 1.26.17 PM.png -rw-r--r--@ 1 aaron staff 7 18 Apr 13:26 file01.txt drwxr-xr-x 3 aaron staff 102 18 Apr 13:25 folder 01 drwxr-xr-x 2 aaron staff 68 18 Apr 13:25 folder 02 解决方法
解
我正在测试’.’作为目录…你正在测试一些其他目录.然后,相对于当前目录检查从目录中读取的名称.如果我使用其他一些目录名,我几乎可以获得除“.”之外的所有内容.和’..’列为文件,无论如何. 如果您在名称前加上$ARGV [0]的值,您将获得预期的结果: #!/bin/perl -w use strict; if ($ARGV[1]) { die("Error: You can only monitor one directory at a timen"); } my $directory = $ARGV[0] || die "Error: No directory definedn"; opendir(DIR,$directory) || die "Error: Can't open dir $directory: $!"; my @contents = readdir(DIR); foreach my $item(@contents) { next if -d "$ARGV[0]/$item"; print "$ARGV[0]/$item is a filen"; } closedir (DIR); 以前的尝试解释 这适用于MacOS X: #!/bin/perl -w use strict; my @contents = <*>; foreach my $item (@contents) { print "== $itemn"; next if -d $item; print "$item is a filen"; } 测试: MiniMac JL: perl -c xx.pl xx.pl syntax OK MiniMac JL: perl xx.pl == cproto-4.7g == fpqsort1 fpqsort1 is a file == fpqsort1.h fpqsort1.h is a file == fpqsort2 fpqsort2 is a file == fpqsort2.c fpqsort2.c is a file == gcc-predef.h gcc-predef.h is a file == git-1.6.5.7 == go == makefile makefile is a file == qs-test1.c qs-test1.c is a file == qs-test2.c qs-test2.c is a file == RCS == rep-report.txt rep-report.txt is a file == select.c select.c is a file == soq == xx.pl xx.pl is a file MiniMac JL: 给出问题中代码的略微修改版本: #!/bin/perl -w use strict; if ($ARGV[1]) { die("Error: You can only monitor one directory at a timen"); } my $directory = $ARGV[0] || die "Error: No directory definedn"; opendir(DIR,$directory) || die "Error: Can't open dir $directory: $!"; my @contents = readdir(DIR); foreach my $item(@contents) { print "<<$item>>n"; next if -d $item; print"$item is a filen"; } closedir (DIR); 在以前的同一目录上运行它,我得到输出: Minimac JL: perl yy.pl . <<.>> <<..>> <<cproto-4.7g>> <<fpqsort1>> fpqsort1 is a file <<fpqsort1.h>> fpqsort1.h is a file <<fpqsort2>> fpqsort2 is a file <<fpqsort2.c>> fpqsort2.c is a file <<gcc-predef.h>> gcc-predef.h is a file <<git-1.6.5.7>> <<go>> <<makefile>> makefile is a file <<qs-test1.c>> qs-test1.c is a file <<qs-test2.c>> qs-test2.c is a file <<RCS>> <<rep-report.txt>> rep-report.txt is a file <<select.c>> select.c is a file <<soq>> <<xx.pl>> xx.pl is a file <<yy.pl>> yy.pl is a file Minimac JL: 注意Perlish习语’next if -d $item;’.还要注意调试技巧:在通过数组时打印名称 – 使用’<<'和'>>’包围名称有助于识别奇怪的副作用(例如名称中的换行符).我仔细检查了提供的代码产生的结果是否相同 – 它确实如此.我正在运行带有Perl库存的MacOS X 10.6.3. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |