Как я могу проверить, открыт ли дескриптор файла в Perl? [дубликат]

Хотя я обычно соглашаюсь с тем, что inspect является хорошим ответом, я бы не согласился с тем, что вы не можете получить исходный код объектов, определенных в интерпретаторе. Если вы используете dill.source.getsource из dill , вы можете получить источник функций и лямбда, даже если они определены в интерактивном режиме. Он также может получить код для связанных или не связанных классов методов и функций, определенных в карри ... однако вы не сможете скомпилировать этот код без кода объекта-объекта.

>>> from dill.source import getsource
>>> 
>>> def add(x,y):
...   return x+y
... 
>>> squared = lambda x:x**2
>>> 
>>> print getsource(add)
def add(x,y):
  return x+y

>>> print getsource(squared)
squared = lambda x:x**2

>>> 
>>> class Foo(object):
...   def bar(self, x):
...     return x*x+x
... 
>>> f = Foo()
>>> 
>>> print getsource(f.bar)
def bar(self, x):
    return x*x+x

>>> 

32
задан brian d foy 19 September 2009 в 23:54
поделиться

4 ответа

Посмотрите эти ответ расценивать openhandle() от Scalar::Util . Ответ, который я первоначально записал здесь, был однажды лучшее, которое мы могли сделать, но это теперь плохо устарело.

38
ответ дан 27 November 2019 в 20:12
поделиться

Почему Вы хотели бы сделать это? Единственная причина, о которой я могу думать, состоит в том при использовании старых дескрипторов файлов пакета стиля (который Вы, кажется, делаете), и хотят предотвратить случайно сохранение одного дескриптора по другому.

, Что вопрос может быть решен при помощи нового стиля косвенные дескрипторы файлов.

open my $fh, '<', $filename or die "Couldn't open $filename: $!";
11
ответ дан 27 November 2019 в 20:12
поделиться

Perl обеспечивает функция fileno для точно этой цели.

РЕДАКТИРОВАНИЕ я признаю ошибку на цели fileno(). Я действительно предпочитаю более короткий тест

fileno FILEHANDLE

более чем

tell FH != -1

8
ответ дан 27 November 2019 в 20:12
поделиться

Tell выдает предупреждение (как и stat, -s, -e и т. Д.) С use warnings (-w)

perl -wle '
    open my $fh, "<", "notexists.txt"; 
    print "can stat fh" if tell $fh
'
tell() on closed filehandle $fh at -e line 1.
-1

Альтернативы fileno ($ fh) и eof ($ fh) не вызывают предупреждений. Я обнаружил, что лучшей альтернативой было сохранить вывод из open .

1
ответ дан 27 November 2019 в 20:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: