如何使用变量值作为Perl中的名称创建新文件?

时间:2010-03-17 05:24:34

标签: perl

例如:

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

这不起作用。请提出一个新方法。

6 个答案:

答案 0 :(得分:17)

此处的所有人都是正确的,您在open的通话中使用单引号。 Single quotes do not interpolate variables into the quoted string. Double quotes do.

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开始,您可以使用更加安全的3参数形式的open,并且可以将文件句柄存储在词法范围的标量中。

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

关于词法文件句柄有许多好处,但一个优秀的属性是当它们的引用计数降为0并且它们被销毁时它们会自动关闭。没有必要明确地关闭它们。

值得注意的是,大多数Perl社区都认为始终使用strictwarnings pragma是个好主意。使用它们有助于在开发过程的早期捕获许多错误,并且可以节省大量时间。

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风格。

我希望你觉得这很有用。

答案 1 :(得分:5)

使用双引号:“&gt; $ 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 :(得分:2)

问题是你使用单引号作为opensingle-quoted strings do not interpolate variables mentioned in them的第二个参数。 Perl将您的代码解释为好像您要打开一个文件,该文件的名称的第一个字符确实有一个美元符号。 (检查你的磁盘;你应该看到一个名为 $ file 的空文件。)

您可以使用open的三参数版本来避免此问题:

open output, '>', $file

然后file-name参数不会意外地干扰open-mode参数,并且没有不必要的变量插值或连接。

答案 3 :(得分:1)

$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等等..

答案 4 :(得分:0)

使用文件句柄:

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

print'$ file'产生$ file,而print“$ file”产生whatevernameyouwant。

答案 5 :(得分:0)

你几乎把它弄好了,但有几个问题。

1 - 你需要在你打开的文件周围使用双引号。 打开输出,“&gt; $ 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!";
}