Что -G делает в Perl? - PullRequest
       30

Что -G делает в Perl?

0 голосов
/ 22 мая 2009

Я искал в Интернете и в Perl doc и, похоже, не могу найти ответ.

Помощь будет оценена.

РЕДАКТИРОВАТЬ :: Он спросил меня о -G, записал его на листе бумаги, и когда я выглядел ошеломленным, попросил меня прочитать основы.

Ответы [ 5 ]

7 голосов
/ 22 мая 2009

Я согласен с JesperE, пожалуйста, покажите нам код. Однако, насколько я могу судить, так и происходит:

if(-G) {

Perl видит это, не распознает -G и поэтому воспринимает это как строку. Становится:

if('-G') {

Что эквивалентно:

if(1) {

Итак, насколько я могу судить, if(-G) ничего не делает. Я пытался использовать его, и всегда кажется, что он возвращает true, что подтверждает мою гипотезу. Дальнейшая поддержка из следующего кода (протестировано на OS X с Perl 5.10.0):

use strict;
use warnings;

my $var = -G;
print "$var\n";

Не выводит предупреждений, компилирует и запускает, а печатает просто «-G».

РЕДАКТИРОВАТЬ: Выполнение поиска, который я должен был сделать намного раньше, предоставляет следующее со страницы perlop в Perldoc:

Unary "-" выполняет арифметическое отрицание, если операнд числовой. Если операнд является идентификатором, возвращается строка, состоящая из знака минус, соединенного с идентификатором. В противном случае, если строка начинается с плюса или минуса, возвращается строка, начинающаяся с противоположного знака. Одним из следствий этих правил является то, что -bareword эквивалентно строке "-bareword". Однако, если строка начинается с неалфавитного символа (исключая «+» или «-»), Perl попытается преобразовать строку в числовое значение и выполнить арифметическое отрицание. Если строка не может быть чисто преобразована в числовое значение, Perl выдаст предупреждение Аргумент "строка" не является числовым в отрицании (-) в ....

Как указано в комментариях, B::Deparse, кажется, показывает, что Perl преобразует if(-G) в if(-'G'). Однако документация (и поведение с print()) согласуются с документацией, в которой говорится, что она должна конвертировать if(-G) в if('-G'). Это никак не повлияет на результат программы.

Однако тонкие различия в типах поведения унарных операторов, которые 99% людей будут когда-либо использовать только для чисел, не являются тем, что я бы назвал «базовым». Я не думаю, что кто-либо должен (или должен был бы) использовать преобразование -bareword в 'bareword' в любой практической ситуации.

2 голосов
/ 22 мая 2009

Я не знаю о -G, но -g описывается здесь как

-g  File has setgid bit set.
2 голосов
/ 22 мая 2009

В Perl нет переключателя -G.

perl -G Нераспознанный переключатель: -G (-h покажет допустимые параметры).

Редактировать: ОК, с -G тоже ничего нет - только -g.

-g В файле установлен бит setgid.

http://perldoc.perl.org/perlfunc.html

В противном случае это чепуха, и вопрос поставлен неправильно.

1 голос
/ 22 мая 2009

Это явная путаница между параметрами [(test) и тестами файлов Perl -X. -G в первом (в моей системе BSD), но не во втором. -G - расширение не в формате posix, и я думаю, что Perl не включал все расширения, только некоторые. Так что, либо он хотел сказать -g, либо он имел в виду [-G $ file]; (для некоторого надмножества POSIX [). Он также находится в моей оболочке по умолчанию (pdksh) и bash (по большей части оболочка по умолчанию для Linux)

-G в тесте или как встроенная оболочка:

-G файл Истинно, если файл существует и его группа соответствует эффективному идентификатору группы этого процесса.

0 голосов
/ 24 мая 2009

В одном ответе говорится: «Я не думаю, что кто-либо должен (или должен был бы) использовать преобразование -bareword в -bareword в любой практической ситуации».

Это широко используется в одном стиле именованных параметров. См. Почтенный CGI для одного:

$cookie1 = $q->cookie(-name=>'riddle_name', -value=>"The Sphynx's Question");
$cookie2 = $q->cookie(-name=>'answers', -value=>\%answers);
print $q->header(
    -type    => 'image/gif',
    -expires => '+3d',
    -cookie  => [$cookie1,$cookie2]
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...