2012-06-26 4 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); EDIT: Я прочитал ваш комментарий сейчас, я не знаю, что вы имеете в виду, можете ли вы отправить код с помощью цикла, пожалуйста? Если вы просматриваете список файлов, как вы можете не иметь их имя? – 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 

Здесь вы знаете только FileDescriptor и найдите имя файла, используя его.

Вы также можете написать намного короче с 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'? –

+1

Это будет работать только в Linux, конечно –

4

Просто сохраните имя файла в переменную, прежде чем открыть ее, а затем перейти оттуда:

my $filename = 'def/t.html'; 
open(IN, '<', $filename) or die $!; 
... 
print "\n$filename: " . $_ . "\n"; 

Обратите внимание, что выше использует 3-Arg форму open(), которая является более безопасным.

(Кроме того, язык является "Perl", а не "PERL".)

+1

Та же идея, но изящная: [IO :: File :: WithPath] (http://p3rl.org/IO::File::WithPath), [IO :: File :: WithFilename] (http: // p3rl .org/IO :: File :: WithFilename) - объекты несут вокруг исходного имени файла – daxim

Смежные вопросы