Ключом к этому является понимание использования переменной $"
(примечание: это не то же самое, что переменная $_
).Переменная $"
:
Это разделитель, используемый между элементами списка, когда переменная массива интерполируется в строку в двойных кавычках.Обычно его значение является пробелом.
Что это значит?Это означает, что есть способ преобразовать массив элементов в строковый контекст, где каждый элемент отделяется специальным символом.По умолчанию этот специальный символ является пробелом ... но мы можем изменить его, изменив переменную $"
.
ALERT SPOILER
В приведенном ниже тексте содержится решение задачи!
ПРЕДУПРЕЖДЕНИЕ О СПОЙЛЕРЕ
Итак, первая часть этого упражнения заключается в распечатке файла встроковый контекст вместо массива.Давайте представим, что у нас есть поддельный файл, содержимое которого:
[/etc/passwd]
User1
User2
User3
[exercise.pl]
#!/usr/local/bin/perl
#
# Program to open the password file, read it in,
# print it, and close it again.
$file = '/etc/passwd'; # Name the file
open(INFO, $file); # Open the file
@lines = <INFO>; # Read it into an array
close(INFO); # Close the file
print "@lines"; # Print the array <---- Notice the double quotes
[RESULT]
User1
User2
User3
Заметили, что пространство между элементами добавлено?Это потому, что когда мы интерполируем массив в строковый контекст, в игру вступает переменная $"
и добавляет пробел между каждым элементом по мере его сцепления. Далее нам нужно изменить это пространство на «#».Мы можем изменить переменную $"
перед печатью, чтобы сделать это:
[exercise.pl]
#!/usr/local/bin/perl
#
# Program to open the password file, read it in,
# print it, and close it again.
$file = '/etc/passwd'; # Name the file
open(INFO, $file); # Open the file
@lines = <INFO>; # Read it into an array
close(INFO); # Close the file
$" = "#"; # Change $" <---- This line has been added!
print "@lines"; # Print the array <---- Notice the double quotes
[RESULT]
User1
#User2
#User3
Хорошо!Мы почти там.Последний бит - получить «#» перед самой первой строкой.Поскольку $"
меняет разделитель между элементами, это не влияет на самую первую строку!Мы можем закончить это, изменив оператор print
, чтобы он печатал «#», за которым следовало содержимое файла:
[exercise.pl]
#!/usr/local/bin/perl
#
# Program to open the password file, read it in,
# print it, and close it again.
$file = '/etc/passwd'; # Name the file
open(INFO, $file); # Open the file
@lines = <INFO>; # Read it into an array
close(INFO); # Close the file
$" = "#"; # Change $" <---- This line has been added!
print "#" . "@lines"; # Print the array <---- Notice the double quotes
[RESULT]
#User1
#User2
#User3