【问题标题】:stat function in file module文件模块中的 stat 函数
【发布时间】:2022-09-29 06:05:25
【问题描述】:

谁能帮我理解下一行的含义?

#!/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] 的含义。

    标签: file perl stat


    【解决方案1】:

    ( 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 中的那个。在这种情况下,您发布的 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 要求使用$_ 而不是作为参数提供其输入,这真的很奇怪。

    【讨论】:

      【解决方案2】:

      我得到了答案。

      子模块 rootdev 的输入是 grep {-e readlink} grep {-l} glob("/dev/shm/v/*")

      因此,首先从/dev/shm/v/ 目录中获取文件列表并使用grep 进行过滤,仅用于符号链接。

      然后检查设备 id(stat 函数的第一个数组信息)并将其与根设备进行比较。

      它用于检查/dev/shm/v 中符号链接的指向设备是根设备还是不包含或排除任何内容。

      【讨论】:

        猜你喜欢
        • 2013-02-09
        • 2023-03-04
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多