Chinaunix首页 | 论坛 | 博客
  • 博客访问: 427869
  • 博文数量: 133
  • 博客积分: 936
  • 博客等级: 准尉
  • 技术积分: 1069
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 15:54
文章分类

全部博文(133)

文章存档

2016年(19)

2013年(22)

2012年(92)

分类:

2012-10-17 18:59:57

原文地址:perl之Globbing 作者:huaius

一、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 = ;
@a = glob("/etc/host*");


在标量向下文中,glob表达式返回下一个匹配的文件名,直至undef,所以如果要遍历整个glob的列表可用以下代码:
while (defined($nextname = )) {
    print "one of the files is $nextname\n";
}


glob表达式支持多个pattern,其结果相当于多个列表合在一起。如:
@fred_barney_files = ;

glob表达支持变量展开:
if (-d "/usr/etc") {
    $where = "/usr/etc";
} else {
    $where = "/etc";
}
@files = <$where/*>;

但如果尖括号中只有单个变量,则必须写成<${where}>,否则它表示从文件中读取内容。

阅读(900) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~