Perl: добавление строки в $ _ приводит к странным результатам - PullRequest
7 голосов
/ 30 августа 2011

Я написал супер простой скрипт:

 #!/usr/bin/perl -w
 use strict;
 open (F, "<ids.txt") || die "fail: $!\n";
 my @ids = <F>;
 foreach my $string (@ids) {
 chomp($string);
 print "$string\n";
 }
 close F;

Это производит ожидаемый вывод всего содержимого ids.txt:

привет

мир

это

раздражает

* 1014 исходный код *

линия

Теперь я хочу добавить расширение файла: .txt для каждой строки. Эта строка должна помочь:

 #!/usr/bin/perl -w
 use strict;
 open (F, "<ids.txt") || die "fail: $!\n";
 my @ids = <F>;
 foreach my $string (@ids) {
 chomp($string);
 $string .= ".txt";
 print "$string\n";
 }
 close F;

Но результат таков:

.txto

.txtd

.txte

.txtying

.txtcecode

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

Я пытался расколоть, сжать, заменить (s / \ n //), объединить и все что угодно. Но результат все равно замена вместо добавления.

Где ошибка?

Ответы [ 3 ]

15 голосов
/ 30 августа 2011

Chomp не удаляет ОБА \r и \n, если файл имеет окончания строки DOS и вы работаете в Linux / Unix.

На самом деле вы видите исходную строку, возврат кареткии расширение, которое перезаписывает первые 4 символа на дисплее.

Если входящий файл имеет окончания строки DOS / Windows, вы должны удалить оба:

s/\R+$//
1 голос
/ 31 августа 2011

Полезный метод отладки, когда вы не совсем уверены, почему ваши данные настроены на то, чем они являются, - это выгрузить их с помощью Data :: Dumper:

#!/usr/bin/perl -w
use strict;
use Data::Dumper ();
$Data::Dumper::Useqq = 1; # important to be able to actually see differences in whitespace, etc

open (F, "<ids.txt") || die "fail: $!\n";
my @ids = <F>;
foreach my $string (@ids) {
    chomp($string);
    print "$string\n";
    print Data::Dumper::Dumper( { 'string' => $string } );
}
close F;
0 голосов
/ 30 августа 2011

вы пробовали это?

foreach my $string (@ids) {
  chomp($string);
  print $string.".txt\n";
}

Я не уверен, что не так с вашим кодом. эти результаты странные

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