perl - 如何在perl中一次使用严格的地方处理多行字符串?

标签 perl string multiline filehandle

我试图找出正确的PBP批准的方式来一次处理多行字符串。许多Perl编码人员建议将多行字符串视为文件句柄,除非您在脚本中使用“严格”,否则该文件就可以正常工作。然后,您会收到来自编译器的警告,告知您在使用严格引用时无法将字符串用作符号。

这是问题的一个简单的工作示例:

#use strict;
use warnings; 

my $return = `dir`;
my $ResultsHandle = "";
my $matchLines = "";
my $resultLine = "";
open $ResultsHandle, '<', \$return;
while (defined ($resultLine = <$ResultsHandle>)) {
    if ($resultLine =~ m/joe/) {
        $matchLines = $matchLines . "\t" . $resultLine;
    }
}
close($ResultsHandle);
print "Original string: \n$return\n";
print "Found these matching lines: \n$matchLines\n";

请注意,“使用严格”行已被注释掉。当我在不使用严格的情况下运行此脚本时,我得到了我想要的东西并期望:
Original string: 
 Volume in drive D has no label.
 Volume Serial Number is 50D3-54A6

 Directory of D:\Documents and Settings\username\My Documents\Eclipse\myTestProject

09/18/2009  11:38 AM    <DIR>          .
09/18/2009  11:38 AM    <DIR>          ..
09/18/2009  11:36 AM               394 .project
09/18/2009  11:37 AM                 0 joe.txt
09/18/2009  11:37 AM                 0 joey.txt
09/18/2009  11:38 AM                 0 kurt.txt
09/18/2009  11:43 AM               497 main.pl
09/18/2009  11:38 AM                 0 shane.txt
               6 File(s)            891 bytes
               2 Dir(s)   6,656,188,416 bytes free

Found these matching lines: 
    09/18/2009  11:37 AM                 0 joe.txt
    09/18/2009  11:37 AM                 0 joey.txt

不过,这就是问题所在。当我取消注释“use strict”行时,我从Perl得到以下警告或错误:
Can't use string ("") as a symbol ref while "strict refs" in use at D:/Documents and Settings/username/My Documents/Eclipse/myTestProject/main.pl line 8.

第8行是“open $ ResultsHandle,'<',\$ return;”。顺便说一句。因此,由于Perl Best Practices要求我使用严格的规范,因此PBP如何期望我一次处理多行字符串? SO社区有什么建议吗?

谢谢!

最佳答案

不要初始化$ResultsHandle:

use strict;
use warnings; 

my $return = `dir`;
my $ResultsHandle;  # <-- leave undefined
my $matchLines = "";
my $resultLine = "";
open $ResultsHandle, '<', \$return;
while (defined ($resultLine = <$ResultsHandle>)) {
    if ($resultLine =~ m/joe/) {
        $matchLines = $matchLines . "\t" . $resultLine;
    }
}
close($ResultsHandle);
print "Original string: \n$return\n";
print "Found these matching lines: \n$matchLines\n";

如果您在$ResultsHandle之前将open()保留为undefined,则将使用对文件句柄的引用来填充它。因为您将其设置为字符串,所以open()假定它应该是对变量的符号引用,而不是---在use strict下是不允许的。

关于perl - 如何在perl中一次使用严格的地方处理多行字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1445426/

相关文章:

perl - 我应该如何将对象传递给子程序?

string - 在 elisp 中转义反斜杠

string - 在不使用 num2str 的情况下将数字转换为字符串

php - HTML 中的多行表单?

c++ - std::regex,匹配字符串的开始/结束

perl - 如何告诉 PostgreSQL 使用其他 Perl 版本?

html - 使用 Perl 解析 html

perl - 是否可以在分发测试之前安装 perl 先决条件以及如何安装?

python - 在不使用内置函数的情况下计算子字符串的出现次数

python - 使用 f 字符串舍入 float