例如:
$variable = "10000";
for($i=0; $i<3;$i++)
{
$variable++;
$file = $variable."."."txt";
open output,'>$file' or die "Can't open the output file!";
}
这不起作用。请提出一个新方法。
答案 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社区都认为始终使用strict和warnings 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)
问题是你使用单引号作为open
和single-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!";
}