Как напечатать строки из файла с лидирующей строкой, используя Perl? - PullRequest
1 голос
/ 23 июня 2011

Я очень новичок в Perl.Я начал этот урок http://www.comp.leeds.ac.uk/Perl/. В разделе обработки файлов есть упражнение, которое гласит:

Измените вышеуказанную программу так, чтобы весь файл печатался с символом # в началекаждая строка.Вам нужно только добавить одну строку и изменить другую.Используйте переменную $ ".

Это программа:

#!/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

Может ли кто-нибудь помочь мне с этой очень простой задачей? Кроме того, что это означает, когда упоминается $переменная?Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 24 июня 2011

Ключом к этому является понимание использования переменной $" (примечание: это не то же самое, что переменная $_).Переменная $":

Это разделитель, используемый между элементами списка, когда переменная массива интерполируется в строку в двойных кавычках.Обычно его значение является пробелом.

Что это значит?Это означает, что есть способ преобразовать массив элементов в строковый контекст, где каждый элемент отделяется специальным символом.По умолчанию этот специальный символ является пробелом ... но мы можем изменить его, изменив переменную $".

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
3 голосов
/ 23 июня 2011

Возможно, вам следует поискать переменную $" в perldoc perlvar и посмотреть, что она делает.Если вы это сделаете, остальное легко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...