Случайное имя файла в 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();