Вы всегда должны включать весь соответствующий код, задавая вопрос. В этом случае выведите оператор печати, который является центром вашего вопроса. Печатное заявление - вероятно, самая важная часть информации. Второй наиболее важной частью информации является ошибка, которую вы также не включили. В следующий раз включите оба из них.
print $ids
должно быть довольно сложным утверждением, чтобы его испортить, но это возможно. Возможные причины:
$ids
не определено. Выдает предупреждение undefined value in print
$ids
выходит за рамки. С use
strict
выдает фатальное предупреждение Global
variable $ids needs explicit package
name
, а в противном случае неопределенное
предупреждение сверху.
- Вы забыли точку с запятой в конце
линия.
- Вы пытались сделать
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.