首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl中的tilde (~)目录

Perl中的tilde (~)目录
EN

Stack Overflow用户
提问于 2013-08-08 09:52:35
回答 4查看 2.3K关注 0票数 3

当我创建并检查是否存在带有倾斜号的目录时,我在Perl脚本中发现了一个轻微的错误行为,如果我使用完整的/home/user路径,就不会发生这种情况。当我第一次运行这个脚本时,它会创建新的目录。当我第二次运行它时,它不承认目录的存在,并尝试第二次创建它:

代码语言:javascript
复制
#!/usr/bin/perl
use strict;

my $outdir = '~/test';
my $cmd = "mkdir $outdir";
unless (-d $outdir) {
  0 == system($cmd) or die "Error creating outdir $outdir\n $?";
}

1;


[~] $ rm test/ -rf
[~] $ perl dir.pl
[~] $ perl dir.pl
mkdir: cannot create directory `/home/avilella/test': File exists
Error creating outdir ~/test
 256 at dir.pl line 7.

如何可靠地处理在Perl中使用倾斜~符号的目录?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-08 09:55:37

由shell解释为“倾斜”表示您的主目录。

因此,Perl的-d操作符可以看到与shell调用'mkdir ~/whatever' (将~扩展为/home/user)不同的东西(称为~的文件/目录)。

我将尝试使用专用Perl函数来执行您的操作。您将避免产生新的进程,您的文件访问将以一致的方式执行。

注意Perl的mkdir内置函数。还请注意档案::Glob模块,它确实执行~字符的扩展(如果用户手动输入目录名,可能会很有用)。

票数 11
EN

Stack Overflow用户

发布于 2013-08-08 09:56:50

您可以使用%ENV主目录,它是从shell导入的值:

代码语言:javascript
复制
my $home = $ENV{HOME};

您还应该知道mkdir是一个Perl内置函数:

代码语言:javascript
复制
mkdir "$home/test" or die "Cannot create test: $!";
票数 5
EN

Stack Overflow用户

发布于 2013-08-08 10:10:02

~system函数调用的shell解释。它是将~替换为用户主目录的shell。就Perl或内核而言,~与任何其他字符一样,是指具有一个字符名称的文件或目录。因此,-d完成的测试失败了,因为没有名为~的目录。

如果您使用Perl的内置mkdir函数,而不是通过shell脚本调用外部命令,那么此时就会出现错误,因为目录~不存在。

用户的主目录几乎总是在环境变量HOME中可用。如果您愿意,如果不存在HOME,可以重新查询用户数据库,但这是一种不正常的情况。如果存在HOME环境变量,请使用它,因为有时更改它以运行具有不同配置文件的程序是有用的,而且环境变量在实践中总是可用的,而用户数据库可能由于某些配置中的网络故障而不可用(例如,NIS或LDAP)。

代码语言:javascript
复制
my $home_directory = $ENV{HOME};
if (!defined $home_directory) {$home_directory = getpwuid($<);}
my $outdir = "$home_directory/test";
unless (-d $outdir) {
    mkdir $outdir or die "Error creating $outdir: $!\n"
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18122939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档