2012-06-26 49 views
2

我有这个简单的脚本,我正在努力。我必须承认,我对PERL完全陌生,并且有些陷入这个愚蠢的问题。如何获取打开的文件的文件名?

open(IN, "<def/t.html") or die(); 
while(<IN>) { 
    chomp; 
    if($_ =~ m/FF0000/) { 
     print "\n".$_."\n"; 
    } 
} 

所以...我打开t.html并在文件中找到给定的字符串。输出是好的,但我还需要找到一个文件的文件名,以便打印。我真的不知道如何回复这个,我需要在$_之后。我在这里先向您的帮助表示感谢。

+0

文件名是“t.html”。有什么问题? – Tim

+0

我可以在代码中看到它。这只是一个简单的例子。这个问题会发生,当我检查一个循环内的一些文件。在那种情况下,我不会知道这一点。我只有几个没有文件名的文件内容片段,其中脚本创建了给定的字符串。 – jakkolwiek

+0

你的意思是t.html?假设这个值存储在一个变量$ temp中,你可以执行以下操作:my $ index = index($ temp,'/'); $ temp = substr($ temp,$ index + 1);编辑:我现在阅读你的评论,我不知道你的意思,你可以张贴循环代码吗?如果你正在浏览一个文件列表,你怎么能没有他们的名字? – raz3r

回答

3

这是一个奇怪的想法,但你可以,如果你想:

$ cat 1.pl 

#somewhere in the code 
open(F, "f.txt"); 
my $f = fileno(F); 

#here you want to find the filename 
open(FILENAME, "ls -l /proc/$$/fd/$f|"); 
my @fn = split(/\s+/, <FILENAME>); 
print $fn[$#fn],"\n"; 

$ perl 1.pl 
/home/ic/f.txt 

在这里,你只知道文件描述符并使用它找到文件名。

你也可以写多少与readlink短:

open(F, "f.txt"); 
my $f = fileno(F); 

#here you want to find the filename 
print readlink("/proc/$$/fd/$f"), "\n"; 

我必须指出,该文件可以删除已经(但如果它是开放仍然存在)。

+1

+1,但在Windows的情况下如何? – 2012-06-27 09:34:03

+1

当然,这只会在Linux下工作 –

4

只需在一个变量保存的文件名,你打开它之前,然后再从那里:

​​

注意的是,上述使用的open() 3 arg格式,这是更安全的。

(另外,语言是 “Perl的”,而不是 “PERL”。)

+1

相同的想法,但优雅:[IO :: File :: WithPath](http://p3rl.org/IO::File::WithPath),[IO :: File :: WithFilename](http:// p3rl .org/IO :: File :: WithFilename) - 这些对象带有原始文件名 – daxim

相关问题