Как я могу создать новый файл, используя значение переменной в качестве имени в Perl? - PullRequest
4 голосов
/ 17 марта 2010

Например:

$variable = "10000";
for($i=0; $i<3;$i++)
{
   $variable++;
   $file = $variable."."."txt";
   open output,'>$file' or die "Can't open the output file!"; 
}

Это не работает. Пожалуйста, предложите новый способ.

Ответы [ 6 ]

17 голосов
/ 17 марта 2010

Все здесь имеют это право, вы используете одинарные кавычки в своем звонке на open. Одинарные кавычки не интерполируют переменные в строку в кавычках. Двойные кавычки делают.

my $foo  = 'cat';

print 'Why does the dog chase the $foo?';  # prints: Why does the dog chase the $foo?
print "Why does the dog chase the $foo?";  # prints: Why does the dog chase the cat?

Пока все хорошо. Но другие не дали вам несколько важных советов о open.

Функция open развивалась годами, как и Perl, работающий с файловыми дескрипторами. В старые времена open всегда вызывался с режимом и именем файла, объединенным во втором аргументе. Первым аргументом всегда был глобальный дескриптор файла.

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

Начиная с Perl 5.6.0, вы можете использовать форму открытия с тремя аргументами, которая намного более безопасна, и вы можете хранить свой дескриптор файла в скалярном лексическом ограничении.

open my $fh, '>', $file or die "Can't open $file - $!\n";
print $fh "Goes into the file\n";

Есть много хороших вещей в лексических дескрипторах файлов, но одно замечательное свойство заключается в том, что они автоматически закрываются, когда их счетчик падает до 0, и они уничтожаются. Нет необходимости явно закрывать их.

Еще кое-что, на что стоит обратить внимание, - это то, что большинство Perl-сообщества считают, что рекомендуется всегда использовать строгие и предупреждения прагмы. Их использование помогает выявить многие ошибки на ранних этапах процесса разработки и может значительно сэкономить время.

use strict;
use warnings;

for my $base ( 10_001..10_003 ) {

   my $file = "$base.txt";
   print "file: $file\n";

   open my $fh,'>', $file or die "Can't open the output file: $!";

   # Do stuff with handle.
}

Я тоже немного упростил ваш код. Я использовал оператор диапазона для генерации ваших базовых чисел для имен файлов. Поскольку мы работаем с числами, а не со строками, я смог использовать _ в качестве разделителя тысяч для улучшения читабельности без влияния на конечный результат. Наконец, я использовал идиоматический цикл perl for вместо стиля C, который у вас был.

Надеюсь, вы найдете это полезным.

5 голосов
/ 17 марта 2010

используйте двойные кавычки: "> $ file". одинарные кавычки не будут интерполировать вашу переменную.

$variable = "10000";
for($i=0; $i<3;$i++)
{
   $variable++;
   $file = $variable."."."txt";
   print "file: $file\n";
   open $output,">$file" or die "Can't open the output file!";
   close($output);
}
2 голосов
/ 17 марта 2010

Проблема в том, что вы используете одинарные кавычки для второго аргумента open, а строки в одинарных кавычках не интерполируют переменные, указанные в них . Perl интерпретировал ваш код так, как если бы вы хотели открыть файл, в котором действительно был знак доллара для первого символа его имени. (Проверьте свой диск; вы должны увидеть там пустой файл с именем $ file .)

Вы можете избежать проблемы, используя версию с тремя аргументами open:

open output, '>', $file

Тогда аргумент имени файла не может случайно помешать аргументу открытого режима, и нет ненужной интерполяции или конкатенации переменных.

1 голос
/ 25 апреля 2017
$variable = "10000";
for($i=0; $i<3;$i++)
{
   $variable++;
   $file = $variable . 'txt';
   open output,'>$file' or die "Can't open the output file!"; 
}

это работает 1.txt 2.txt и т. Д.

0 голосов
/ 17 марта 2010

У вас почти все правильно, но есть пара вопросов.

1 - Вам нужно использовать двойные кавычки вокруг открываемого файла. открыть вывод "> $ file" или умереть [...] 2 - Незначительные суеты, потом файлы не закрываются.

Я бы переписал твой код примерно так:

#!/usr/bin/perl
$variable = "1000";
for($i=0; $i<3;$i++) {
        $variable++;
        $file = $variable."."."txt";
        open output,">$file" or die "Can't open the output file!";
}
0 голосов
/ 17 марта 2010

Использовать дескриптор файла:

my $file = "whatevernameyouwant";
open (MYFILE, ">>$file");
print MYFILE "Bob\n";
close (MYFILE);

print '$ file' возвращает $ file, тогда как print '$ file' дает любое имя.

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