Perl - проблема с сохранением файла - PullRequest
0 голосов
/ 02 апреля 2012

Я использую следующий код:

open my $fh, "<", $file;

$/ = undef;
my $report = <$fh>;
$/ = "\n";

close $fh;

print("$report\n\n");

$ file ссылается на текстовый файл, который выглядит следующим образом:

a    1
b    2
c    3

Я запускал этот код на двух разных компьютерах Linux,Один из них дал мне ожидаемый результат (именно так, как он отображается в текстовом файле).Другой дал мне это вместо этого:

GLOB(0x80f1174)

... что эффективно мешает мне продолжать манипулировать содержимым.

Я проверил версии Perl - та, которая дает мне ожидаемый результат5,10, а другой 5,8.Однако в прошлом я выполнял точно такой же код для аналогичных файлов с работающим 5.8.

Я также пытался преобразовать файл из DOS в UNIX через: set ff = unix, но безрезультатно.

Ответы [ 4 ]

4 голосов
/ 02 апреля 2012

Неработающий файл не содержит

my $report = <$fh>;    # aka: readline($fh)

Возможно, он содержит

my $report = $fh;
my $report = < $fh >;  # aka: glob(" $fh ") = " GLOB(0xXXXXXXX) "
my $report = <$fh >;   # aka: glob("$fh ")  = "GLOB(0xXXXXXXX) "
my $report = < $fh>;   # aka: glob(" $fh")  = " GLOB(0xXXXXXXX)"

<> является сокращением для readline или glob (никакого отношения к слову GLOB в выходных данных). Пробелы делают это glob.

1 голос
/ 03 апреля 2012

Я бы порекомендовал просто использовать модуль File :: Slurp из CPAN. Тогда ваш код может выглядеть так:

use File::Slurp 'read_file';
my $file = '/path/to/some/file';
my $report = read_file $file;
print("$report\n\n");

Намного более читабельно и предсказуемо, ИМО.

0 голосов
/ 03 апреля 2012

Можно использовать File :: Slurp, как рекомендует Hercynium, механизм, который ближе к тому, как выглядит ОП, выглядит так:

my $report = do {
  open my $fh, '<', $file;
  local $/;
  <$fh>;
};

Когда все выполнено таким образом, все изменения являются локальными для do block, включая закрытие дескриптора файла.

NB perldoc -f do говорит нам

do BLOCK

Не совсем функция.Возвращает значение последней команды в последовательности команд, обозначенной BLOCK.

Заметьте, что кроме контекста последнего выполненного оператора есть контекст do block (здесь скалярный).Я считаю do блоки очень полезными (и недостаточно используемыми);это отличный способ иметь лексический блок выполнения, но все же легко вернуть что-то во внешнюю область.

0 голосов
/ 02 апреля 2012

Да, запишите

<$fh>

, так как $ fh приведет к ошибкам, так как $ fh - это просто дескриптор файла.Печать будет эквивалентна печати ссылки.Такие, как приведенные ниже коды, запись как FH приведет к ошибке времени выполнения.

open FH,$infile or die$!;
while(<FH>){
    @line=split(/,/);
    if($flag==0){
     foreach my $col (@line){
      $header{$col}=$count;
      $count++;
     }
 }
}
close(FH);
...