关注我的其他问题here ..
我有以下代码,我逐行阅读网页内容,尝试匹配某个模式,如果匹配,则将其写入文件:
foreach my $line (split qr/\R/, $mech->content) {
if ($line=~ m/t\/([A-Z]+)/){
print $fileHandle "$1\n";
}
}
我想知道是否可以将匹配的行附加到另一个多行变量,并仅在循环结束时将其写入文件。
我希望它成为那种方式的原因是因为我想使用以下子例程将数据保存到文件中,而不是直接执行:
writeToFile("fileName.tmp","path",data);
这是我写的子程序,除了将数据保存在文件中之外,还检查以下内容:
因此,如果我能够创建这个额外的变量,我将少一个文件写入磁盘。
答案 0 :(得分:4)
您可以通过字符串连接来完成,在循环中只需用
替换print即可$data .= "$1\n";
# Same as $data = $data . "$1\n";
或者使用Perl map
的魔力来构建多行字符串,而不需要循环或if
:
my $data = join "",
map { /t\/([A-Z]+)/ ? "$1\n" : "" }
split(qr/\R/, $mech->content);
或者,你甚至不必经历分裂和加入的痛苦。
只需将多行字符串视为单个字符串(/g
修饰符,让正则表达式反复匹配),并用3行代替整个循环:
my $data = $mech->content();
$data =~ s/t\/([A-Z]+)/$1\n/g;
writeToFile("fileName.tmp", "path", $data);
答案 1 :(得分:1)
这很简单 - 你可以使用.=
运算符(它是组合赋值(=
)和连接(.
)附加字符:
my $data = "";
while (my $line = ...) {
...
$data .= $line . "\n";
}
writeToFile("fileName.tmp", "path", $data);
答案 2 :(得分:1)
只需替换
open(my $fileHandle, ...) or ...;
...
print $fileHandle "$1\n";
带
my $data = '';
...
$data .= "$1\n";
将输出附加到字符串而不是将其发送到文件句柄。