Случайное имя файла в perl, сгенерированное необычными символами

Используя приведенный ниже код perl, я пытаюсь вывести некоторые имена в случайно сгенерированный файл. Но файлы создаются со странными символами, такими как это:

"СНП-список-boo.dwjEUq5Wu^J.txt"

И, очевидно, когда мой код ищет эти файлы, он говорит, что не такой файл. Кроме того, когда я пытаюсь открыть файлы с помощью "vi", они открываются так

vi 'temporary-files/snp-list-boo.dwjEUq5Wu
.txt'

т.е. с "новой строкой" в имени файла. Кто-то, пожалуйста, помогите мне понять и решить эту странную проблему. Большое спасибо!

код:

my $tfile = `mktemp boo.XXXXXXXXX`;
my $fh = "";
     foreach my $keys (keys %POS_HASH){
       open ($fh, '>>', "temporary-files/snp-list-$tfile.txt");
        print $fh "$keys $POS_HASH{$keys}\n";
        close $fh;
         }

2 ответа

Решение

mktemp возвращает символ перевода строки в своем выводе, который вам нужно сначала выполнить chop() или chomp().

Вместо использования внешнего mktemp программа, почему бы вам не пойти с File::Temp вместо этого?

Использование внешних программ без необходимости является плохой идеей по нескольким причинам.

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

Это последний, кто жжет тебя здесь. Но остальные все еще применяются.

В стандартную библиотеку Perl уже много лет входит модуль File:: Temp, который создает временные файлы для вас без необходимости использования внешней программы.

use File::Temp qw/ tempfile /;

# It even opens it and gives you the filehandle.
($fh, $filename) = tempfile();
Другие вопросы по тегам