编写一个Perl脚本,列出用户指定目录的目录内容

时间:2018-08-02 12:25:00

标签: perl

我尝试过此代码,但不适用于用户输入目录。 它仅列出PWD。 救命!

#script to list the directory contents of a user specified directory

system("pwd");
print "enter the path of your d1rectory\n";
$path =<STDIN>;
system(" cd Spath");
#system ("chdir $path");
system("ls");

My code screenshot

2 个答案:

答案 0 :(得分:3)

Unix进程具有与之关联的“环境”。该环境包含有关流程运行方式的详细信息。例如,环境的要素之一就是当前的工作目录。

当一个进程启动另一个进程时,新的子进程将从父进程继承环境的副本。子进程可以更改其环境副本中所需的任何内容,但不能更改父环境的副本(或者至少不容易)。

您的代码涉及四个过程。调用system()时会创建一个新进程,并带有新的环境副本。当每个对system()的调用退出时,其环境将不复存在。

  1. 您的程序是第一个过程。它继承了启动它的Shell进程环境的副本。该环境具有当前的工作目录。
  2. 第一次调用system()会创建一个新进程,并为其提供主程序环境的副本。该子进程运行pwd并退出。它的环境副本消失了。
  3. 下一次对system()的调用将创建另一个新进程,并为其提供主程序环境的新副本。该子进程将更改其当前工作目录-但仅用于其环境副本。当退出对system()的调用时,该环境副本(具有更改后的当前工作目录)将不复存在。
  4. system()的最终调用将创建另一个新进程,并为其提供主程序环境的新副本(该副本仍具有原始程序的当前工作目录)。该进程在其当前目录上调用ls,然后退出-删除进程中的环境。

因此,实际上,您对cd的调用没有任何作用,因为它会在立即不存在的环境中更改目录。

快速的解决方案(如您所示)是将$path变量传递给ls

正确的解决方案(如您所显示的)是不要使用子流程来执行此操作,而应使用Perl的内置工具。

当我看到这样的问题时,我不得不想知道这些天他们在计算机课程上的教学内容:-)

答案 1 :(得分:-1)

在评论中已经提到@toolic,您必须制作system "ls $path"

但是您已经在Perl中,可以使用globopendir之类的Perl内置函数。例如

my $s = <STDIN>;
chomp $s;
$s .= '/' if length($s);
while(my $file = glob("\Q$s\E*")){

    print $file,"\n";
}