#!/usr/bin/perl -w
print “which directory?(Default is your home directory)”;
chomp(my
d
i
r
=
<
S
T
D
I
N
>
)
;
i
f
(
dir=<STDIN>); if(
dir=<STDIN>);if(dir=~/\A\s*\Z/){#空白行
chdir or die “can’t chdir to your home directory:$!”;
}else{
chdir
d
i
r
o
r
d
i
e
"
c
a
n
′
t
c
h
d
i
r
t
o
′
dir or die "can't chdir to '
dirordie"can′tchdirto′dir’:KaTeX parse error: Expected 'EOF', got '}' at position 6: !"; }̲ my @files=<*>…_\n";
}
#首先,我们会显示一个简单的提示,然后取得用户想要的目录,对它进行必要的chomp
#如果没有chomp,则会尝试转到一个名称结尾有换行符的目录,chdir函数不能自动帮你把换行符去掉
#接下来,如果目录不是空的,我们会切换到该目录下,遇到错误就中断执行,如果名称是空的,就以用户主目录来代替
#最后,使用星号的glob操作会返回(新)工作目录中所有的文件名,并自动按字母顺序排序,然后逐一输出
#!/usr/bin/perl -w
#!/usr/bin/perl -w
print “which directory?(Default is your home directory)”;
chomp(my
d
i
r
=
<
S
T
D
I
N
>
)
;
i
f
(
dir=<STDIN>); if(
dir=<STDIN>);if(dir=~/\A\s*\Z/){#空白行
chdir or die “can’t chdir to your home directory:$!”;
}else{
chdir
d
i
r
o
r
d
i
e
"
c
a
n
′
t
c
h
d
i
r
t
o
′
dir or die "can't chdir to '
dirordie"can′tchdirto′dir’:KaTeX parse error: Expected 'EOF', got '}' at position 6: !"; }̲ my @files=<.*…\n";
}
#和前一题有两点差别,第一,这次的glob操作符包含了“点号星号”,它会匹配所有以点号开头的文件名
#第二,我们必须对所得到的的列表进行排序,因为取出的列表中,以点号开头的文件名会和不以点号开头的文件名交错排列
#看起来比较凌乱,排序之后会清楚很多
#!/usr/bin/perl -w
print “which directory?(Default is your home directory)”;
chomp(my
d
i
r
=
<
S
T
D
I
N
>
)
;
i
f
(
dir=<STDIN>); if(
dir=<STDIN>);if(dir=~/\A\s*\Z/){
chdir or die “can’t chdir to your home directory:$!”;
}else{
chdir
d
i
r
o
r
d
i
e
"
c
a
n
′
t
c
h
d
i
r
t
o
′
dir or die "can't chdir to '
dirordie"can′tchdirto′dir’:KaTeX parse error: Expected 'EOF', got '}' at position 6: !"; }̲ opendir DOT,"…!";
foreach (sort readdir DOT){
#next if /\a./;#如果跳过文件名以点号开头的文件
print "$\n";
}
#如果你在前题使用的是目录句柄,用文件名匹配重写一次
#如果使用的是文件名通配,用目录句柄重写一次
#这个程序的结构跟前两题一样,但是现在我们改用打开目录句柄的方式,
#变更工作目录之后,我们会打开当前目录,也就是DOT目录句柄
#为什么要用DOT呢?
#如果用户输入了像/etc这样的绝对目录名称,那么打开它并没有什么问题,
#但是,如果用户键入了像fred这样的相对目录名称呢?
#readdir函数会取得目录里所有的文件名,然后再由程序将他们排序输出
#如果用这种方式来做第一题,那么我们就应该略过文件名以点号开头的文件
#要这么做,只需把foreach循环里的注释去掉就行了
#readdir类型的函数不一定要当前目录,其实可以作用在任何目录上
#!/usr/bin/perl -w
foreach(@ARGV){
unlink
o
r
w
a
r
n
"
c
a
n
′
t
u
n
l
i
n
k
′
_ or warn "can't unlink '
orwarn"can′tunlink′':KaTeX parse error: Expected 'EOF', got '\n' at position 16: !,continuing...\̲n̲"; } #如果想在程序遇到问…,然后称为unlink的参数
#如果其中出现问题,警告信息能提供线索
#!/usr/bin/perl -w
use File::Basename;
use File::Spec;
my(
s
o
u
r
c
e
,
source,
source,dest)=@ARGV;
if (-d $dest){
my $basename =basename $source;
d
e
s
t
=
F
i
l
e
:
:
S
p
e
c
−
>
c
a
t
f
i
l
e
(
dest=File::Spec->catfile(
dest=File::Spec−>catfile(dest,$basename);
}
rename
s
o
u
r
c
e
,
source,
source,dest or die "can’t rename ‘
s
o
u
r
c
e
′
t
o
′
source' to '
source′to′dest’:KaTeX parse error: Expected 'EOF', got '\n' at position 2: !\̲n̲"; #功能类似mv,将命令行…dest是目录,我们需要从
s
o
u
r
c
e
名
称
中
取
出
文
件
基
名
,
并
将
它
附
加
到
source名称中取出文件基名,并将它附加到
source名称中取出文件基名,并将它附加到dest后面
#最后,一旦$dest经过必要的处理,rename函数会执行实际改名的动作
#!/usr/bin/perl -w
use File::Basename;
use File::Spec;
my(
s
o
u
r
c
e
,
source,
source,dest)=@ARGV;
if (-d $dest){
my $basename =basename $source;
d
e
s
t
=
F
i
l
e
:
:
S
p
e
c
−
>
c
a
t
f
i
l
e
(
dest=File::Spec->catfile(
dest=File::Spec−>catfile(dest,$basename);
}
link
s
o
u
r
c
e
,
source,
source,dest or die “can’t link ‘
s
o
u
r
c
e
′
t
o
′
source' to '
source′to′dest’?!\n”;
#功能类似ln,建立从第一个参数到第二个参数的硬链接
#这个程序和前一题的十分相似,唯一的差别在于这次执行的是link而非rename
#!/usr/bin/perl -w
use File::Basename;
use File::Spec;
my
s
y
m
l
i
n
k
=
symlink=
symlink=ARGV[0] eq ‘-s’;
shift @ARGV if
s
y
m
l
i
n
k
;
m
y
(
symlink; my(
symlink;my(source,$dest)=@ARGV;
if (-d $dest){
my $basename =basename $source;
d
e
s
t
=
F
i
l
e
:
:
S
p
e
c
−
>
c
a
t
f
i
l
e
(
dest=File::Spec->catfile(
dest=File::Spec−>catfile(dest,KaTeX parse error: Expected 'EOF', got '}' at position 12: basename); }̲ if (symlink){
symlink
s
o
u
r
c
e
,
source,
source,dest or die “can’t make soft link ‘
s
o
u
r
c
e
′
t
o
′
source' to '
source′to′dest’?!\n”;
}else{
link
s
o
u
r
c
e
,
source,
source,dest or die "can’t make hard link from ‘
s
o
u
r
c
e
′
t
o
′
source' to '
source′to′dest’:KaTeX parse error: Expected 'EOF', got '\n' at position 2: !\̲n̲"; } #开头几行程序代码(…symlink变量中
#如果检查到了-s,我们还得把它去掉
#最后,依照$symlink的值是真是假,程序会选择建立硬链接或者软连接
#最后,还更改了die后面的信息,让它清楚地显示出我们试图建立的是哪一种链接
#-s选项,建立软连接,而非硬链接
#!/usr/bin/perl -w
foreach(glob(’.* ‘)){
my $dest=readlink
;
p
r
i
n
t
"
_; print "
;print"_->$dest\n" if defined KaTeX parse error: Expected 'EOF', got '}' at position 8: dest; }̲ #表达式 .* 就是单个字符…_的值
#如果这个条目是软连接,那么就会由readlink返回一个已定义的值并输出链接位置
#如果不是,测试条件就会失败,从而使得程序略过这个条目
#让它在当前目录下查找所有符号链接并输出它们的值,和ls -l的格式一样:name->value
#glob(’. *’)这个地方中间有空白