我正在使用此代码获取特定目录中所有文件的列表:
opendir DIR, $dir or die "cannot open dir $dir: $!";
my @files= readdir DIR;
closedir DIR;
Run Code Online (Sandbox Code Playgroud)
如何修改此代码或向其添加内容以便它只查找文本文件并仅加载带有文件名前缀的数组?
示例目录内容:
.
..
923847.txt
98398523.txt
198.txt
deisi.jpg
oisoifs.gif
lksdjl.exe
Run Code Online (Sandbox Code Playgroud)
示例数组内容:
files[0]=923847
files[1]=98398523
files[2]=198
Run Code Online (Sandbox Code Playgroud) 我给Perl的glob函数提供了一个globs列表和一个字符串.球体按预期处理,但始终找到弦.例如:
$ ls
foo
$ perl -le '@files=glob("*bar"); print @files' ## prints nothing, as expected
$ perl -le '@files=glob("bar"); print @files'
bar
Run Code Online (Sandbox Code Playgroud)
如上所示,bar即使没有这样的文件,第二个示例也会打印出来.
我的第一个想法是它的行为就像shell一样,当没有可用的扩展时,一个glob(或被视为glob的东西)扩展到自己.例如,在csh(可怕的是,这是Perl的glob()功能似乎如下,请参阅下面的引用):
% foreach n (*bar*)
foreach: No match.
% foreach n (bar)
foreach? echo $n
foreach? end
bar ## prints the string
Run Code Online (Sandbox Code Playgroud)
但是,根据文档,glob应该返回文件名扩展(强调我的):
在列表上下文中,返回EXPR值的文件名扩展(可能为空)列表,例如标准的Unix shell/bin/csh.
那么为什么在传递给参数的参数中没有通配符时它会返回glob?这是一个错误还是我做错了什么?
在perl中,我从一个目录中读取文件,我想同时打开它们(但是逐行),这样我就可以执行一个将所有第n行一起使用的函数(例如连接).
my $text = `ls | grep ".txt"`;
my @temps = split(/\n/,$text);
my @files;
for my $i (0..$#temps) {
my $file;
open($file,"<",$temps[$i]);
push(@files,$file);
}
my $concat;
for my $i (0..$#files) {
my @blah = <$files[$i]>;
$concat.=$blah;
}
print $concat;
Run Code Online (Sandbox Code Playgroud)
我只是一堆错误,使用未初始化的值和GLOB(..)错误.那我怎么能做这个呢?
我正在编写一个脚本来查找目录中的某些文件并对其进行处理.我继续写下面的内容:
opendir DIR, $dir;
@files = readdir DIR;
closedir DIR;
Run Code Online (Sandbox Code Playgroud)
虽然我可以(实际上应该)将它包装在一个函数中,但我想知道是否有更优雅的方法来做到这一点?
这个答案表明glob有时可以返回不存在的'文件名'.
@deck = glob "{A,K,Q,J,10,9,8,7,6,5,4,3,2}{\x{2660},\x{2665},\x{2666},\x{2663}}";
Run Code Online (Sandbox Code Playgroud)
但是,该代码在运行时返回一个空列表.
我错过了什么?
此运行来自Windows XP上使用-e的命令提示符,ActiveState Perl版本为5.005_02.从同一台机器上保存的脚本运行会产生相同的结果.
使用ActiveState Perl v5.8.7在Windows XP上使用-e运行会返回一个数组.
我有关于删除Perl中的文件的问题.我想删除扩展名文件夹中的所有文件.log.在Perl中有一种聪明的方法吗?
我没有太多编码perl的经验.