perl - 编写一个 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");
解决方案
一个 Unix 进程有一个与之相关的称为“环境”的东西。环境包含进程如何运行的详细信息。例如,环境的元素之一是当前工作目录。
当一个进程启动另一个进程时,新的子进程会从父进程继承环境的副本。子进程可以在其环境副本中更改它想要的任何内容,但它不能更改父进程的环境副本(或者,至少,不容易)。
您的代码涉及四个过程。在调用中system()
创建一个新进程,带有一个新的环境副本。当每次调用system()
退出时,它的环境就不复存在了。
- 你的程序是第一个过程。它继承了启动它的 shell 进程的环境副本。这个环境有一个当前工作目录。
- 第一次调用
system()
创建一个新进程并为其提供主程序环境的副本。该子进程运行pwd
并退出。它的环境副本消失了。 - 下一次调用
system()
创建另一个新进程并为其提供主程序环境的新副本。该子进程更改其当前工作目录 - 但仅限于其环境副本。当调用system()
退出时,该环境副本(及其更改的当前工作目录)将不复存在)。 - 最后调用
system()
创建另一个新进程并为其提供主程序环境的新副本(它仍然具有原始程序的当前工作目录)。该进程调用ls
其当前目录,然后退出 - 在进程中删除其环境。
因此,实际上,您的调用cd
不会执行任何操作,因为它会在立即不复存在的环境中更改目录。
快速修复(如您所见)是将$path
变量传递给ls
.
正确的解决方法(正如您也看到的那样)是不使用子进程来执行此操作,而是使用 Perl 的内置工具。
当我看到这样的问题时,我不得不想知道这些天他们在计算机课程上教什么:-)
推荐阅读
- html - 两个 html 文件的一个通用提交按钮
- elasticsearch - 特定字段的 Elasticsearch 精确匹配
- mysql - 如果不允许创建 ipv4 地址,如何访问 CloudSQL 只读副本
- vba - 根据单个单元格值将项目复制/粘贴到另一张纸上
- csv - 剖析 .csv 数据
- android - 防止 Android 杀死暂停的音频服务
- django - django-filter - 在过滤后的数据中添加聚合
- python - PyBeacon eddystone-UID
- javascript - 如何使用 node-fetch 从 API 获取数据和响应状态?
- c++ - #include 在包被标记为未解决的结论