Вы не избегаете или не цитируете свои цитаты.
Литеральная строка " awk -F"
начинается с двойной кавычки и продолжается только до тех пор, пока не увидит еще одну неоткрытую двойную кавычку.Так что сделано на F"
.Если после этого поставить =
, то это совершенно другой токен .Вы назначаете.
Причина, по которой в сообщении об ошибке написано, что назначение происходит справа налево.Посмотрите дальше вниз, и вы увидите
"...OFS="=" /var/tmp/file "
Это назначение, с которого оно начинается.Затем он смотрит влево и видит, что вы присваиваете его назначению.И дает вам ошибку, которую вы получаете.
Perl позволит вам поместить двойные кавычки в интерполированную строку (такую, которая допускает «строковое преобразование» переменных), которые обычно обозначаются двойными кавычками.Но вам нужно использовать qq
:
Посмотрите внимательно на раскраску между двумя линиями:
system(" awk -F" = " '{s[$1]++}{print $1s[$1],$2}' OFS=" = " /var/tmp/file " );
system( qq(awk -F"=" '{s[$1]++}{print $1s[$1],$2}' OFS="=" /var/tmp/file));
Посмотрите очень внимательно на первую строку, обратите внимание, что остальная часть строкикрасноватый, в то время как равны черный .Он выпрыгнул из строки, и вы имеете дело с =
в качестве нового токена.
Теперь, SO подсветка не слишком хорошо справляется со всеми возможностями Perl, поэтому оператор qq(
не подсвечен правильно.Но если вы проигнорируете это, вы увидите, что все содержимое в кавычках отображается как в кавычках.И если вы верите, что qq
справится с передачей всего этого как строки, то вы поверите, что это все грамматическая единица SAME .