У меня есть следующий Perl. Он пытается обнаружить Git Clone (в отличие от автономного почтового индекса) и распечатать информацию репо. Идея заключается в том, что если git rev-parse
терпит неудачу, то это, вероятно, не Git repo.
if (system "git rev-parse HEAD") { # Line 234
my $revision = `git rev-parse HEAD | cut 1-16`; # Line 235
my $branch = `git rev-parse --abbrev-ref HEAD`; # Line 236
print "Git repo: $branch ($revision)\n"; # Line 237
} # Line 238
В результате этого возникают ошибки. Если я правильно разбираю What's the differences between system and backticks and pipes in Perl и How can I store the result of a system command in a Perl variable, он должен работать.
Согласно How to print variables in Perl, print "Git repo: $branch ($revision)\n"
должен работать. На основании Global symbol requires explicit package, Q & A говорит использовать @
вместо $
. Я попробовал print "Git repo: @branch (@revision)\n"
, но это привело к тем же ошибкам (с другим символом).
У меня есть два вопроса:
Почему Perl думать переменная представляет собой пакет?
Что не так с Perl и как его исправить?
Global symbol "@branch" requires explicit package name at ./Configure line 237.
Global symbol "@revision" requires explicit package name at ./Configure line 237.
В 'system' возвращает '0' на успех. Поэтому, если вы попадете в блок 'if', это означает, что команда (сама)' git rev-parse HEAD' не удалась. Тогда то же самое произойдет и в 'qx' (backticks). Я подозреваю, что это не то, что вы имеете в виду? Что касается ошибки, которую вы получаете, я понятия не имею. Это означает, что переменная '$ branch' не объявлена, что является странным. – zdim
Можете ли вы сократить свой код до короткой, запущенной программы, которая демонстрирует проблему? Используя код, отправленный в вопросе (с логикой в 'if' reverseed, по причинам @zdim уже объяснено), я не могу воспроизвести описанные вами ошибки. Помимо плохо отформатированного текста (переводы строк в конце '$ branch' и' $ revision'), он отлично работает для меня. –
@zdim - спасибо. Я так далеко не получил из-за ошибок Глобального Символа (но я подозревал это). – jww