2016-06-29 1 views
-1

У меня есть следующий 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. 
+0

В 'system' возвращает '0' на успех. Поэтому, если вы попадете в блок 'if', это означает, что команда (сама)' git rev-parse HEAD' не удалась. Тогда то же самое произойдет и в 'qx' (backticks). Я подозреваю, что это не то, что вы имеете в виду? Что касается ошибки, которую вы получаете, я понятия не имею. Это означает, что переменная '$ branch' не объявлена, что является странным. – zdim

+0

Можете ли вы сократить свой код до короткой, запущенной программы, которая демонстрирует проблему? Используя код, отправленный в вопросе (с логикой в ​​'if' reverseed, по причинам @zdim уже объяснено), я не могу воспроизвести описанные вами ошибки. Помимо плохо отформатированного текста (переводы строк в конце '$ branch' и' $ revision'), он отлично работает для меня. –

+0

@zdim - спасибо. Я так далеко не получил из-за ошибок Глобального Символа (но я подозревал это). – jww

ответ

0

Я не могу проверить свой сценарий, но эта часть должна быть такой:

if(`git rev-parse HEAD 2>&1` !~ /Not a git repository/) { 
    chomp(my $revision = `git rev-parse HEAD | cut -c1-16`); 
    chomp(my $branch = `git rev-parse --abbrev-ref HEAD`); 
    print "Git repo: $branch ($revision)\n"; 
}