如何通过文件句柄获取文件名?

如何通过文件句柄获取文件名?

RT,有直接的方法吗?

Code:
sub sub1
{
    my $file = shift;
    print $file "test";
}

open FILE, ">test.dat";
sub1(*FILE);

在sub1里面,能通过$file获取文件的名字吗?

thanks
应该不是不可以的,就是可能比较麻烦些
不如说说你取它干什么?

BTW:我的签名里就有这个问题,典型的思路错误。


QUOTE:
原帖由 flw 于 2008-6-5 13:03 发表
不如说说你取它干什么?

BTW:我的签名里就有这个问题,典型的思路错误。

版主英明!
当我看到这个帖子的时候,我就知道flw会给楼猪上一课的。
有些时候,你需要有点历史知识才行。
很简单啊,我就想把文件名写到文件中去。
嗯,要是没有方法,把文件名当参数传一下就行了~
我只是想知道有没有这样的方法,以前没见过……
其实不通用的方法还是有一个
前提是你用的是linux

/proc/$pid/fd
这个文件夹
此处
$pid是进程号,可以通过$$取得
fd下面有很多文件描述符,对于一个打开的文件句柄,文件描述符可以通过
fileno($filehander)取得
你自己看看/proc/$pid/fd里面好了,里面的都是软链接,指向文件在硬盘上的位置
你自己新建一个read的文件,然后用下面的脚本试试

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
use warnings;
open my $file,"<","read" or die "Fail to open $!";
my $file_num = fileno($file);
my $raw_data =  qx @ file /proc/$$/fd/$file_num @ ;
chomp $raw_data;
print "raw data is $raw_data \n";
print "File name is ",(split /\s+/,$raw_data)[-1],"\n"

但这个方法并不是很通用

变态一点可以写成下面那样

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
use warnings;
open my $file,"<",$ARGV[0] or die "Fail to open $!";
{ local $\ ="\n";
        print "File name is ", map {   ( split )[-1]  } qx | file /proc/$$/fd/@{[fileno($file)]} |;
}

通过

[Copy to clipboard] [ - ]
CODE:
./name your_input_file

来运行

哎,真没注意到阿!


QUOTE:
原帖由 churchmice 于 2008-6-5 13:49 发表
其实不通用的方法还是有一个
前提是你用的是linux

/proc/$pid/fd
这个文件夹
此处
$pid是进程号,可以通过$$取得
fd下面有很多文件描述符,对于一个打开的文件句柄,文件描述符可以通过
fileno($fil ...

多谢churchmice指点! 这个方法是可以获取文件名的!


QUOTE:
原帖由 johnrobbet 于 2008-6-5 13:45 发表
很简单啊,我就想把文件名写到文件中去。
嗯,要是没有方法,把文件名当参数传一下就行了~
我只是想知道有没有这样的方法,以前没见过……

那为啥不把文件名当作参数传递过去,然后在 sub1 内部再打开文件?