Как напечатать переменные в Perl - PullRequest
24 голосов
/ 31 мая 2011

У меня есть код, который выглядит как

my ($ids,$nIds);
while (<myFile>){
    chomp;
    $ids.= $_ . " ";
    $nIds++;
}

Это должно объединить каждую строку в моем myFile, а nIds должно быть моим числом строк.Как распечатать мои $ids и $nIds?

Я пытался просто print $ids, но Perl жалуется.

my ($ids, $nIds)

- это список, верно?С двумя элементами?

Ответы [ 3 ]

29 голосов
/ 31 мая 2011
print "Number of lines: $nids\n";
print "Content: $ids\n";

Как Perl жаловался? print $ids должен работать, хотя вы, вероятно, захотите новую строку в конце, либо явно с print, как указано выше, либо неявно с помощью say или -l / $ \ .

Если вы хотите интерполировать переменную в строке и сразу после нее иметь что-то, что будет похоже на часть переменной, но это не так, заключите имя переменной в {}:

print "foo${ids}bar";
11 голосов
/ 31 мая 2011

Вы всегда должны включать весь соответствующий код, задавая вопрос. В этом случае выведите оператор печати, который является центром вашего вопроса. Печатное заявление - вероятно, самая важная часть информации. Второй наиболее важной частью информации является ошибка, которую вы также не включили. В следующий раз включите оба из них.

print $ids должно быть довольно сложным утверждением, чтобы его испортить, но это возможно. Возможные причины:

  1. $ids не определено. Выдает предупреждение undefined value in print
  2. $ids выходит за рамки. С use strict выдает фатальное предупреждение Global variable $ids needs explicit package name, а в противном случае неопределенное предупреждение сверху.
  3. Вы забыли точку с запятой в конце линия.
  4. Вы пытались сделать print $ids $nIds, в этом случае Perl считает, что $ids должен быть файловым дескриптором, и Вы получаете ошибку, такую ​​как print to unopened filehandle.

Пояснения

1: не должно происходить. Это может произойти, если вы сделаете что-то подобное (при условии, что вы не используете strict):

my $var;
while (<>) {
    $Var .= $_;
}
print $var;

Дает предупреждение для неопределенного значения, потому что $Var и $var - две разные переменные.

2: Может случиться, если вы сделаете что-то вроде этого:

if ($something) {
    my $var = "something happened!";
}
print $var;

my объявляет переменную внутри текущего блока. Вне блока это вне области.

3: Достаточно простая, распространенная ошибка, легко исправляемая. Легче определить с use warnings.

4: Также распространенная ошибка. Существует несколько способов правильно вывести две переменные в одном выражении print:

print "$var1 $var2";  # concatenation inside a double quoted string
print $var1 . $var2;  # concatenation
print $var1, $var2;   # supplying print with a list of args

И, наконец, несколько советов по магии Perl для вас:

use strict;
use warnings;

# open with explicit direction '<', check the return value
# to make sure open succeeded. Using a lexical filehandle.
open my $fh, '<', 'file.txt' or die $!;

# read the whole file into an array and
# chomp all the lines at once
chomp(my @file = <$fh>);
close $fh;

my $ids  = join(' ', @file);
my $nIds = scalar @file;
print "Number of lines: $nIds\n";
print "Text:\n$ids\n";

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

Варианты:

  • print "@file" эквивалентно $ids = join(' ',@file); print $ids;
  • $#file вернет последний индекс в @file. Поскольку массивы обычно начинаются с 0, $#file + 1 эквивалентно scalar @file.

Вы также можете сделать:

my $ids;
do {
    local $/;
    $ids = <$fh>;
}

Временно «отключив» $/, разделитель входных записей, то есть символ новой строки, вы заставите <$fh> вернуть весь файл. На самом деле <$fh> читает, пока не найдет $/, а затем вернет эту строку. Обратите внимание, что это сохранит символы новой строки в $ids.

Построчное решение:

open my $fh, '<', 'file.txt' or die $!; # btw, $! contains the most recent error
my $ids;
while (<$fh>) {
    chomp;
    $ids .= "$_ "; # concatenate with string
}
my $nIds = $.; # $. is Current line number for the last filehandle accessed.
9 голосов
/ 31 мая 2011
Как мне распечатать мои идентификаторы $ и $ nIds?
print "$ids\n";
print "$nIds\n";
Я пытался просто print $ids, но Perl жалуется.

Жалуется на что?Неинициализированное значение?Возможно, ваш цикл не был введен из-за ошибки открытия файла.Убедитесь, что open вернул ошибку, и убедитесь, что вы используете use strict; use warnings;.

my ($ids, $nIds) - это список, верно?С двумя элементами?

Это (очень особенный) вызов функции.$ids,$nIds - список с двумя элементами.

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