如何在Perl中使用stat函数?

z2acfund  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(166)

谁能帮我理解下面这行字的意思?

#!/usr/bin/perl

use File::stat;

...

sub rootdev { return (stat readlink)[0] == (stat "/")[0]; }
my @vols = shuffle map {/.*\/([0-9]+)/} grep {not rootdev} grep {-e readlink} grep {-l} glob("/dev/shm/v/*");

...

有类似上面的子模块,但是我不明白stat readlink)[0] == (stat "/")[0]的意思。

ovfsdjhp

ovfsdjhp1#

( LIST )[ LIST ]称为列表切片。
它返回第一个列表中由第二个列表返回的索引标识的元素。

say for ( 'A'..'Z' )[ 0, 1, 2, 25 ];   # A B C Z

这表示( stat ... )[0]会传回stat传回的第一个值。
内置的stat操作符返回文件的信息,它返回了许多值,第一个是文件的设备ID。
因此,当使用内置的stat时,( stat $path )[0]返回由$path指定的文件的设备id。
但是,您使用的不是构建的stat,而是File::stat中的stat。在这种情况下,您发布的sub没有任何用处。它实际上执行return 0,因为它比较的是两个不同对象的内存地址。下面是为使用File:stat的stat而做的调整:

use File::stat;

sub rootdev { return ( stat readlink )->dev == ( stat "/" )->dev; }

use File::stat;

sub rootdev { return stat( readlink )->dev == stat( "/" )->dev; }

最后,令人奇怪的是,sub要求使用$_而不是作为参数提供其输入。

ukqbszuj

ukqbszuj2#

我知道答案了。
子模块rootdev的输入为grep {-e readlink} grep {-l} glob("/dev/shm/v/*")
因此,首先从/dev/shm/v/目录中获取文件列表,并仅使用grep过滤符号链接。
然后检查设备id(stat函数的第一个数组信息),并将其与根设备进行比较。
它用于检查/dev/shm/v中符号链接的指向设备是否为根设备,以包括或排除任何内容。

相关问题