Perl существует ли файл
Теперь вы знаете, как открыть дескриптор файла для вывода, уничтожив существующий файл с таким же именем. Предположим, вы хотите удостовериться, что файла с таким именем не существует (чтобы избежать случайного уничтожения своей электронной таблицы или очень важного календаря дней рождений). Если бы вы писали сценарий shell, вы использовали бы для проверки существования файла нечто вроде -е имя_фаила. Аналогичным образом в Perl применяется операция -е $filevar, которая проверяет факт существования файла, заданного в скалярной переменной $filevar. Если этот файл существует, результат — "истина"; в противном случае операция дает "ложь"**. Например:
* Хотя при наличии модуля File:: Copy этот способ оказывается лишним.
** Это не совсем хорошо, если вы работаете с lock-файлами или если файлы часто появляются и исчезают. В этом случае вам нужно обратиться к функциям sysopen и flock, которые описаны в книге Programming Perl, или изучить примеры, приведенные в главе 19.
Операнд операции -е — любое скалярное выражение, вычисление которого дает некоторую строку, включая строковый литерал. Вот пример, в котором проверяется наличие файлов index-html и index.cgi в текущем каталоге:
Существуют и другие операции. Например, -r $filevar возвращает значение "истина", если заданный в $filevar файл существует и может быть прочитан. Операция -w $filevar проверяет возможность записи в файл. В следующем примере файл с заданным пользователем именем проверяется на возможность чтения и записи:
Есть много других операций для проверки файлов. Полный перечень их приведен в таблице 10.1.
Таблица 10.1. Операции для проверки файлов и их описание
Обозначение | Описание |
-r | Файл или каталог доступен для чтения |
-w | Файл или каталог доступен для записи |
-X | Файл или каталог доступен для выполнения |
-о | Файл или каталог принадлежит владельцу |
-R | Файл или каталог доступен для чтения реальным пользователем, но не "эффективным" пользователем (отличается от -r для программ с установленным битом смены идентификатора пользователя) |
-W | Файл или каталог доступен для записи реальным пользователем, но не "эффективным" пользователем (отличается от -w для программ с установленным битом смены идентификатора пользователя) |
-X | Файл или каталог доступен для выполнения реальным пользователем, но не "эффективным" пользователем (отличается от -х для программ с установленным битом смены идентификатора пользователя) |
-0 | Файл или каталог принадлежит реальному пользователю, но не "эффективному"пользователю (отличается от -о для программ с установленным битом смены идентификатора пользователя) |
-е | Файл или каталог существует |
-2 | Файл существует и имеет нулевой размер (каталоги пустыми не бывают) |
-s | Файл или каталог существует и имеет ненулевой размер (значение — размер в байтах) |
-f | Данный элемент — обычный файл |
-d | Данный элемент — каталог |
-1 | Данный элемент — символическая ссылка |
-S | Данный элемент — порт |
-P | Данный элемент — именованный канал (FIFO-файл) |
-b | Данный элемент — блок-ориентированный файл (например, монтируемый диск) |
-с | Данный элемент — байт-ориентированный файл (например, файл устройства ввода-вывода) |
-u | У файла или каталога установлен идентификатор пользователя |
-g | У файла или каталога установлен идентификатор группы |
-k | У файла или каталога установлен бит-липучка |
-t | Выполнение операции isatty() над дескриптором файла дало значение "истина" |
-T | Файл — текстовый |
-B | Файл — двоичный |
-M | Время с момента последнего изменения (в днях) |
-A | Время с момента последнего доступа (в днях) |
-C | Время с момента последнего изменения индексного дескриптора (в днях) |
Большинство этих проверок возвращает просто значение "истина" или "ложь". О тех, которые этого не делают, мы сейчас поговорим.
Операция -s возвращает значение "истина", если файл непустой, но это значение особого вида. Это длина файла в байтах, которая интерпретируется как "истина" при ненулевом значении.
Операции -м, -а и -с (да-да, в верхнем регистре) возвращают количество дней соответственно с момента последнего изменения файла, доступа к нему и изменения его индексного дескриптора*. (Индексный дескриптор содержит всю информацию о файле; подробности см. на man-странице, посвященной системному вызову stat.) Возвращаемое значение — десятичное число,
* Эти значения определяются относительно времени запуска программы, занесенного в системном формате времени в переменную $ "т. Если запрашиваемое значение относится к событию, которое произошло после начала работы программы, оно может быть отрицательным.
соответствующее прошедшему времени с точностью до 1 секунды: 36 часов возвращается как 1,5 дня. Если при отборе файлов будет выполнено сравнение этого показателя с целым числом (например, с 3), то вы получите только те файлы, которые были изменены ровно столько дней назад, ни секундой раньше и ни секундой позже. Это значит, что для получения всех файлов, значение определенного показателя для которых находится в диапазоне от трех до четырех дней, вам, вероятно, нужно будет использовать операцию сравнения диапазонов*, а не операцию сравнения значений.
Эти операции могут работать не только с именами файлов, но и с дескрипторами. Для этого нужно просто указать в качестве операнда дескриптор файла. Так, чтобы проверить, доступен ли для выполнения файл, открытый как somefile, можно сделать следующее:
Если имя или дескриптор файла не указаны (т.е. даны только операции -r или -s), то по умолчанию в качестве операнда берется файл, указанный в переменной $_ (опять эта переменная!). Так, чтобы проверить список имен файлов и установить, какие из них доступны для чтения, нужно просто-напросто написать следующее:
* Или операцию int.
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
myMock.TGZ - имя файла, расположенного во входной папке. Имя файла может измениться. Но путь всегда хранится в $base_path .
мне нужно проверить, существует ли файл в $base_path .
- -r
Файл читается эффективным uid / gid. - -w
Файл доступен для записи с помощью эффективного uid / gid. - -x
Файл исполняется эффективным uid / gid. - -o
Файл принадлежит эффективному uid. - -R
Файл читается реальным uid / gid. - -W
Файл доступен для записи с помощью реального uid / gid. - -X
Файл исполняется реальным uid / gid. - -O
Файл принадлежит реальному uid. - -e
Файл существует. - -z
Файл имеет нулевой размер (пуст). - -s
Файл имеет ненулевой размер (возвращает размер в байтах). - -f
Файл-это обычный файл. - -d
Файл-это каталог. - -l
Файл-это символьная ссылка (false, если символьные ссылки не поддерживаются файловой системой). - -p
Файл-это именованный канал (FIFO), или Filehandle-это канал. - -S
Файл-это сокет. - -b
Файл-это блочный специальный файл. - -c
Файл-это специальный символьный файл. - -t
Файловый хэндл открывается на tty. - -u
Файл имеет установленный бит setuid. - -g
Файла бит setgid. - -k
Файл имеет липкий набор бит. - -T
Файл представляет собой текстовый файл ASCII или UTF-8 (эвристическое предположение). - -B
Файл является "двоичным" файлом (напротив -T ). - -M
Время запуска скрипта минус время изменения файла, в днях. - -A
То же самое для времени доступа. - -C
То же самое для времени изменения индекса (Unix, может отличаться для других платформ)
вы, возможно, захотите, такой вариант существует . perldoc-f" - f"
-e является оператором' existence ' в Perl.
Вы можете проверить разрешения и прочие атрибуты, используя код на этой странице.
вы можете использовать: if(-e $base_path)
использование:
-e возвращает true, даже если файл является каталогом. -f вернет true только если это фактический файл
Я запускаю CGI-скрипт с apache2, и у меня есть эта строка предупреждения об ошибке.log (я удалил все подобные строки из выходных данных): [Thu Jul 30 09:39:37 2009] upload.pl: Constant subroutine ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::UPLOAD_DIR redefined at /usr/share/perl/5.10/constant.pm line 115, line 133. Constant subroutine ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::BUFFER_SIZE redefined at /usr/share/perl/5.10/constant.pm .
Как напечатать хэш-имя в Perl?
Sed или awk заменить все узоры из другого файла
Я пытаюсь сделать замену шаблона с помощью скрипта SED, но он не работает должным образом Sample_content.txt 288Y2RZDBPX1000000001dhana JP2F64EI1000000002d EU9V3IXI1000000003dfg1000000001dfdfds XATSSSSFOO4dhanaUXIBB7TF71000000004adf 10Q1W4ZEAV18LXNPSPGRTTIDHBN1000000005egw Паттерны.txt 1000000001 9000000003 1000000002 2000000001 1000000003 3000000001 1000000004 4000000001 1000000005 5000000001 Ожидаемый результат 288Y2RZDBPX9000000003dhana JP2F64EI2000000001d EU9V3IXI3000000001dfg90 .
Как вывести цветной вывод на терминал в Python?
Синтаксическая ошибка Perl: Bareword найден там, где ожидался оператор
Понимает ли сейф Perl новые функции?
Я играю с модулем Safe для включения в освоение Perl. Версии до версии v5. 16 (самая ранняя поддерживаемая версия), похоже, не понимают новых ключевых слов. Я что-то упустил? Say работает с v5. 16 и позже use v5.10; use Safe; say "Running $0 under $^V with Safe ", Safe->VERSION; my $compartment = Safe->new; $compartment->permit( ':base_io', ':load' ); my $code =reval( $code ) or do < my $error = $@; .
Почему Perl DBI экранирует значения, полученные из MySQL?
У меня есть значение в MySQL, которое содержит Апостроф (’) и многоточие (. ): $ /bin/echo "select alias from url_alias where source = 'node/12024'" | mysql --skip-column-names -D cat36ia_d7prod Вывод: forum/technical-discussion/nagging-questions-i’ve-been-too-embarrassed-ask… Когда я получаю значение с помощью Perl DBI и DBD::mysql, значение было изменено: $ perl -MDBI -MDBD::mysql -e '$dbh=DBI->connect( "DBI:mysql:database=my_db",nick ); $v=$dbh->selectrow_arr .
Как я могу определить IP-адреса локальной машины из Perl?
Существует ли чистый и независимый от операционной системы способ определения IP-адресов локальной машины из Perl? До сих пор я нашел следующие решения: Анализ выходных данных ifconfig и ipconfig (жесткий диск, разные версии windows имеют разные выходные данные ipconfig) Установите сетевое соединение с известным IP и проверьте локальный IP-адрес сокета (не будет работать, если я не могу установить соединение и определю только один IP адрес) Есть предложения получше? .
Получение серийного номера CPU ID в Perl для win32
Как получить серийный номер процессора или уникальный идентификатор процессора в perl для windows machine без использования каких-либо модулей, возможно, используя syscalls или что-то еще? .
Perl / curl как получить код состояния и тело ответа
Я пытаюсь написать простой perl-скрипт, который вызывает и API, и если код состояния 2xx, то сделайте что-нибудь с ответом. В то время как если это 4xx или 5xx, то сделайте что-нибудь еще. Проблема, с которой я сталкиваюсь, заключается в том, что я могу либо получить код ответа (используя пользовательский формат записи и передавая выходные данные куда-то еще), либо я могу получить весь ответ и заголовки. my $curlResponseCode = `curl -s -o /dev/null -w "%" . `; Даст мне только .
Как я могу избавиться от ошибки "Can't locate object method" warn "via package" sssself " в IE::Mechanize?
Я играю с Win32:: IE:: Mechanize. Я пытаюсь создать скрипт для автоматического доступа к шести моим учетным записям электронной почты в интернете. Скрипт в основном работает, но perl выдает своего рода загадочную ошибку "не удается найти метод объекта "warn" через пакет "sssself" (возможно, вы забыли загрузить " sssself)". Несмотря на ошибку, сценарий все еще может выполнить работу. Но я хочу избавиться от этого и понять, почему это происходит. Ниже приведен сценарий. Пожалуйста добросердечно co .
Разбить строку на массив в Perl
my $line = "file1.gz file2.gz file3.gz"; my @abc = split('', $line); print "@abcn"; Ожидаемый результат: file1.gz file2.gz file3.gz Я хочу, чтобы выход был file1.gz в $abc[0], file2.gz в $abc[1] и file3.gz в $abc[2]. Как мне разделить $line? .
Простой способ сортировки на основе значений в хэше в perl
Обычно сортировку по ключам и последующую итерацию хэша можно выполнить следующим образом: for $k (sort (keys %h)) < print $k, $h; > Но как сделать сортировку на основе значений, а затем перебирать хэш? Я могу придумать, как создать новый хэш, поменяв местами пары ключей и значений. Но есть ли более умный способ сделать это? Большое спасибо. .
с помощью команды grep в Linux с Perl регулярных выражений + захват группы
Итак, я провел некоторые исследования на эту тему, и я не совсем нашел идеальное решение. Например, у меня есть строка внутри переменной. var="a1b1c2" Теперь то, что я хочу сделать, это сопоставить только "a", следующий за любой цифрой, но я хочу, чтобы он только вернул число после "a" Чтобы соответствовать ему правило, такое как 'ad' И поскольку мне нужна только цифра, я попробовал с 'a(d)' И, возможно, он действительно захватил его где-то, но я не знаю, где, выход здесь все еще "a1 .
Bash, Perl или Sed, вставить в новую строку после найденной фразы
Хорошо, я думаю, мне нужно что-то, что будет делать следующее: Найдите эту строку кода в /var/lib/asterisk/bin/retrieve_conf: $engineinfo = engine_getinfo(); Вставить следующие две строки: $engineinfo['engine']="asterisk"; $engineinfo['version']="1.6.2.11"; Заранее спасибо, Джо .
Удалить расширение файла и путь из строки в Perl
Perl: статические методы vs Package
Мне нужно создать пакет, который будет использоваться другими разработчиками. Как лучше всего реализовать статические методы? Для статических методов (класса) я должен ожидать 1-й параметр $class, и метод должен быть вызван как метод класса: My::Package->Sub1(); С другой стороны, я могу написать "обычную" подпрограмму пакета (не ожидаемый параметр $class), которая будет прекрасно делать то же самое, но должна быть вызвана по-другому My::Package::Sub1(); Итак, в принципе нет никакой ра .
Регулярное выражение Notepad++ заменяет именованные группы
Я пытаюсь заменить полное имя автора на название статьи У меня есть список статей, подобных этому: Альбершейн П., Невис Д. Дж. метод анализа сахаров в полисахаридах клеточной стенки растений методом газожидкостной хроматографии/ / исследования углеводов. - 1967 год. – Том. 5, № 3. - Да. 340-345. И у меня есть регулярное выражение для него (?'n1'^d. )(?'n2'(?:(?:[A-ZА-Я][-a-zćа-я ]+)?([A-ZА-Я][-a-zćа-я]+xA0[A-ZА-Я].(?:xA0[A-ZА-Я].),?)(?: [et al])? ?)+)(?'n3' [^/]+[ .
Каков наиболее простой способ заполнения пустых дат в результатах sql (на любом конце mysql или perl)?
Как читать каталоги и подкаталоги, не зная имени каталога в perl?
Привет я хочу читать каталоги и подкаталоги, не зная имени каталога. Текущий каталог-это "D:/Temp". 'Temp' имеет подкаталоги типа 'A1','A2'. Опять же 'A1' имеет подкаталоги типа 'B1','B2'. Опять же 'B1' имеет подкаталоги типа 'C1','C2'. Perl script не знает этих каталогов. Поэтому он должен сначала найти каталог, а затем прочитать один файл за раз в dir 'C1', как только все файлы будут прочитаны в 'C1', он должен измениться на dir 'C2'. Я пробовал с кодом ниже здесь я не хочу читать все файлы в .
Сегодня рассматриваются особые операторы в Perl - "Операторы проверки файлов". Особые тем, что действуют как обычные унарные операторы, но при этом внутренне взаимодействуют с операционной системой. Они принимают один аргумент, являющийся именем файла или его дескриптором, и проверяют, обладает ли этот файл некоторым свойством. Так как данный тип операторов тесно связан с системными вызовами stat и файлами, он рассматривается в разделе Функции: Указатели файлов, файлы или директории
Проверка файла, где X - один из перечисленных далее символов. Унарный оператор принимает один аргумент, это может быть имя файла, файловый дескриптор, либо дескриптор каталога, и проверяет соответствующий файл на соответствие условию. Ели аргумент не указан, проверяет $_ , кроме работы с ключом -t , который использует STDIN. Если не оговорено иное, возвращает 1 для успешной проверки и '' для не успешной, либо неопределенное значение если файл не существует. Несмотря на забавные имена, приоритет у файловых проверок такой же как и у прочих именованных унарных операторов. Оператор может быть один из:
Интерпретация операторов прав доступа ( -r , -R , -w , -W , -x и -X ) основывается исключительно на свойствах файла и пользовательском и групповом идентификаторах пользователя (uids, gids). Могут быть другие причины, по которым не удается читать, записывать или выполнять файл, например, управление доступом сетевых файловых систем, ACL (списки управления доступом), файловые системы только для чтения, и нераспознанные форматы исполняемого файла. Заметим, что использование вышеупомянутых шести операторов для тестирования файла, может привести к ошибке в случае, если в это время над файлом производятся какие либо операциии, что может вызвать зависание, состояние гонки и прочие неприятности.
Также отметим, что для суперпользователя на локальной файловой системе, проверки -r , -R , -w , -W всегда возвращают 1, а -x и -X возвращают 1, если установлен хоть один бит исполнения. Поэтому в сценариях, выполняемых суперпользователем, может потребоваться выполнение stat(), чтобы определить действительный режим файла, либо временно установить другой идентификатор пользователя(анг. effective uid).
Если используется ACL, полезна прагма filetest , которая обеспечивает более точные результаты чем stat(). При вызове use filetest 'access' вышеупомянутые операторы работают с использованием access(2) или аналогичных системных вызовов. Отметим также, что под действием этой прагмы операторы -x и -X могут возвращать истинное значение, даже если биты прав на выполнение не установлены ( или не выставлены какие либо дополнительные права ACL). Эта странность происходит в основе реализации низкоуровневых системных вызовов. Отметим также, что в связи с реализацией use filetest 'access' , там, где распространяется её действие, специальный файловый дескриптор _ не будет кэшировать результаты выполнения операторов проверки файлов. За более подробной информацией обратитесь к документации прагмы filetest .
Обратите внимание, что -s/a/b/ не производит подстановки с отрицанием. Однако -exp ( $foo ) работает, как должно: только одиночные буквы после минуса трактуются как проверка файла.
Ключи -T и -B работают следующим образом. Участок файла примерно в объеме первого блока исследуется на наличие необычных символов, таких как коды управления или байты с установленным старшим битом (не похожие на UTF-8). Если необычных символов слишком много (больше 30%), то файл считается двоичным(), иначе это текстовый( -T ) файл. Также, любой файл считается двоичным, если он содержит в первом блоке нулевой байт ( символ ASCII NUL(\0) ). Если -T или -B применяется к дескриптору файла, то исследуется не первый блок файла, а текущий буфер ввода ( стандартный I/O или "stdio"). Оба оператора -T и -B возвращают истину для пустого файла, или файла, указатель которого находится в EOF|wiki - конце файла, если проверяется дескриптор. Поскольку нужно прочесть файл, чтобы выполнить проверку -T, в большинстве случаев лучше сначала сделать проверку с ключом -f , например next unless -f $file && -T $file .
Если какому-либо из проверок файлов (или операторам stat или lstat операторам) передается специальный дескриптор файла, состоящий из "_" - одного символа подчеркивания, то используется структура stat предыдущей проверки файла (или оператора stat ), что позволяет избежать нового системного вызова. (Это не работает для оператора -t , и нужно помнить, что lstat и -l сохраняют значения в структуре stat, относящиеся к символической ссылке, а не к реальному файлу. ) (Аналогично, если stat буфер был заполнен вызовом lstat , -T и -B сбросят его с результатом stat _ ). Например:
Начиная с версии Perl 5.9.1, как форма синтаксического сахара может использоваться стек операторов тестирования файла. Таким образом, -f -w -x $file эквивалентно -x $file && -w _ && -f _ . ( Но если использовать возвращаемое значение -f $file в качестве аргумента для другого оператора, никакой особой магии не произойдет.
Проверка файла, где X - один из перечисленных далее символов. Унарный оператор принимает один аргумент, это может быть имя файла, файловый дескриптор, либо дескриптор каталога, и проверяет соответствующий файл на соответствие условию. Ели аргумент не указан, проверяет $_ , кроме работы с ключом -t , который использует STDIN. Если не оговорено иное, возвращает 1 для успешной проверки и '' для не успешной, либо неопределенное значение если файл не существует. Несмотря на забавные имена, приоритет у файловых проверок такой же как и у прочих именованных унарных операторов. Оператор может быть один из:
Обратите внимание, что -s /a/ b / не производит подстановки с отрицанием. Однако - exp ( $foo ) работает, как должно: только одиночные буквы после минуса трактуются как проверка файла.
Эти операторы освобождены от "правила похожести на функцию", о котором говорилось выше. То есть, открывающие скобки после оператора не влияют на то, как много последующего кода образуют аргумент. Вставьте открывающуюся скобку перед оператором, чтобы отделить его от кода, который следует за ним (конечно, это относится только к операторам с более высоким приоритетом, чем унарные операторы):
Интерпретация операторов прав доступа -r , -R , -w , -W , -x и -X основывается исключительно на свойствах файла и пользовательском и групповом идентификаторах пользователя (uids, gids). Могут быть другие причины, по которым не удается читать, записывать или выполнять файл, например, управление доступом сетевых файловых систем, ACL (списки управления доступом), файловые системы только для чтения, и нераспознанные форматы исполняемого файла. Заметим, что использование вышеупомянутых шести операторов для тестирования файла, может привести к ошибке в случае, если в это время над файлом производятся какие либо операциии, что может вызвать зависание, состояние гонки и прочие неприятности.
Также отметим, что для суперпользователя на локальной файловой системе, проверки -r , -R , -w и -W всегда возвращают 1, а -x и -X возвращают 1, если установлен хоть один бит исполнения. Поэтому в сценариях, выполняемых суперпользователем, может потребоваться выполнение stat(), чтобы определить действительный режим файла, либо временно установить другой идентификатор пользователя(анг. effective uid).
Если используется ACL, полезна прагма filetest , которая обеспечивает более точные результаты чем stat(). При вызове use filetest 'access' вышеупомянутые операторы работают с использованием access(2) или аналогичных системных вызовов. Отметим также, что под действием этой прагмы операторы -x и -X могут возвращать истинное значение, даже если биты прав на выполнение не установлены ( или не выставлены какие либо дополнительные права ACL). Эта странность происходит в основе реализации низкоуровневых системных вызовов. Отметим также, что в связи с реализацией use filetest 'access' , там, где распространяется её действие, специальный файловый дескриптор _ не будет кэшировать результаты выполнения операторов проверки файлов. За более подробной информацией обратитесь к документации прагмы filetest .
Ключи -T и -b работают следующим образом. Участок файла примерно в объеме первого блока исследуется на наличие необычных символов, таких как коды управления или байты с установленным старшим битом (не похожие на UTF-8). Если необычных символов слишком много (больше 30%), то файл считается двоичным( -B ), иначе это текстовый( -T ) файл. Также, любой файл считается двоичным, если он содержит в первом блоке нулевой байт ( символ ASCII NUL(\0) ). Если -T или -B применяется к дескриптору файла, то исследуется не первый блок файла, а текущий буфер ввода ( стандартный I/O или "stdio"). Оба оператора -T и -B возвращают истину для пустого файла, или файла, указатель которого находится в EOF - конце файла, если проверяется дескриптор. Поскольку нужно прочесть файл, чтобы выполнить проверку -T , в большинстве случаев лучше сначала сделать проверку с ключом -f , например next unless -f $file && -T $file .
Если какому-либо из проверок файлов (или операторам stat или lstat операторам) передается специальный дескриптор файла, состоящий из "_" - одного символа подчеркивания, то используется структура stat предыдущей проверки файла (или оператора stat ), что позволяет избежать нового системного вызова. (Это не работает для оператора -t , и нужно помнить, что lstat и -l сохраняют значения в структуре stat, относящиеся к символической ссылке, а не к реальному файлу.) (Аналогично, если stat буфер был заполнен вызовом lstat , -T и -B сбросят его с результатом stat _ ). Например:
Начиная с версии Perl 5.9.1, как форма синтаксического сахара может использоваться стек операторов тестирования файла. Таким образом, -f -w -x $file эквивалентно -x $file && -w _ && -f _ . (Но если использовать возвращаемое значение -f $file в качестве аргумента для другого оператора, никакой особой магии не произойдет.)
To avoid confusing would-be users of your code with mysterious syntax errors, put something like this at the top of your script:
Читайте также: