一、Globbing
通常,shell将每个命令行中的任何的文件名模式转换成它所匹配的文件名。这被称作globbing。例如,在echo命令后使用了文件名模式*.pm,shell会将它转换成它所匹配的文件名。
my @all_files = glob "*";
foreach $v (@all_files)
{
print $v."\n";
}
@all_files得到了当前目录下的所有文件,这些文件按照字母排序的,不包括由点(.)开头的文件。
my @all_files = glob ".* *";
foreach $v (@all_files)
{
print $v."\n";
}
任何可在命令行中是使用的,均可作为glob 的(单个)参数。这里,我们包括了额外的 点星号(.*) 参数,来得到所有的文件(由点开头的文件,以及不由点开头的文件)。引号中两个项之间的空隔是必须的。
(二)、Globbing的替换语法
虽然我们任意的使用globbing这个术语,我们也谈论glob操作,但在许多使用globbing的程序中并没有出现glob这个字眼。为什么 呢?原因是,许多这类代码在glob操作被命名前就写好了。它使用一对尖括号(<>),和从文件句柄读入操作类似。
my @all_files = <*>;
foreach $v (@all_files)
{
print $v."\n";
}
NOTE:尖括号中的值同双引号中的值一样,会被内插。
即:glob有两种表达方式:尖括号和glob函数,如下所示:
@a = </etc/host*>;
@a = glob("/etc/host*");
在标量向下文中,glob表达式返回下一个匹配的文件名,直至undef,所以如果要遍历整个glob的列表可用以下代码:
while (defined($nextname = </etc/host*>)) {
print "one of the files is $nextname\n";
}
glob表达式支持多个pattern,其结果相当于多个列表合在一起。如:
@fred_barney_files = <fred* barney*>;
glob表达支持变量展开:
if (-d "/usr/etc") {
$where = "/usr/etc";
} else {
$where = "/etc";
}
@files = <$where/*>;
但如果尖括号中只有单个变量,则必须写成<${where}>,否则它表示从文件中读取内容。