首页 > 解决方案 > 编写一个 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");

我的代码截图

标签: perl

解决方案


一个 Unix 进程有一个与之相关的称为“环境”的东西。环境包含进程如何运行的详细信息。例如,环境的元素之一是当前工作目录。

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

您的代码涉及四个过程。在调用中system()创建一个新进程,带有一个新的环境副本。当每次调用system()退出时,它的环境就不复存在了。

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

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

快速修复(如您所见)是将$path变量传递给ls.

正确的解决方法(正如您也看到的那样)是不使用子进程来执行此操作,而是使用 Perl 的内置工具。

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


推荐阅读