Perl获得用户,组和文件许可权并分配给变量

时间:2018-07-17 09:07:37

标签: perl

我在下面的代码中获取文件的用户,组和权限。

use File::stat;

my $filename = "/home/chetanv/filecheck";

my $mode = (stat($filename));
my $user = getpwuid(@$mode[4]);
my $group = getgrgid(@$mode[5]);

printf "Permission : %04o\n", @$mode[2] & 07777;
print "User : $user\n";
print "Group : $group\n";

相同的输出:

Permission : 0777
User : chetanv
Group : wheel

由于我使用printf语句,因此以下行工作正常

printf "Permission : %04o\n", @$mode[2] & 07777;

现在,如果我尝试将其分配给变量以供将来使用,我将无法执行此操作。我尝试过这样的事情:

my $mode = (stat($filename));
my $perm = "%04o\n", @$mode[2] & 07777;
my $user = getpwuid(@$mode[4]);
my $group = getgrgid(@$mode[5]);
print "Perm : $perm\n";
print "User : $user\n";
print "Group : $group\n";

它说,

Useless use of bitwise and (&) in void context 

有人可以帮助我如何将权限输出分配给变量并稍后使用变量

1 个答案:

答案 0 :(得分:4)

my $perm = "%04o\n", @$mode[2] & 07777;

您在这里错过了一个sprintf通话。在上面的示例中,您有printf,用于格式化和打印。如果只想格式化和分配,则必须使用sprintf。这将使错误消失。

此外,由于您正在使用File::stat,因此您的stat调用返回一个对象。您不应该使用底层的数组结构,而应该使用访问器。

my $stat = stat $filename;
my $perm = sprintf "%04o\n", $stat->mode & 07777;

请注意我也是如何将其重命名为$stat的,因为该对象包含有关该文件的stat调用的所有信息,而不仅仅是模式。您可以在整个程序中使用它以提高可读性。