Perl 处理输入文件的代码段的问题
我正在学习一个Perl程序,其中包括以下用于处理输入文件的部分。我不明白什么是Perl 处理输入文件的代码段的问题,perl,Perl,我正在学习一个Perl程序,其中包括以下用于处理输入文件的部分。我不明白什么是s/^\s+/用于?此外,“|”和“| |”在open(FILE,“cat$fileName |”)| | die“无法打开文件”中代表什么 open(文件,“cat$fileName |”)| | die“无法打开文件”; 而() { s/^\s+/; 我的@line=split; 如果($line[0]!~/\:/){$mark=0} 我的$var=$line[$mark]; ##其他代码 } 您可以阅读中各种功能
s/^\s+/代码>用于?此外,“|”和“| |”在open(FILE,“cat$fileName |”)| | die“无法打开文件”中代表什么代码>
open(文件,“cat$fileName |”)| | die“无法打开文件”;
而()
{
s/^\s+/;
我的@line=split;
如果($line[0]!~/\:/){$mark=0}
我的$var=$line[$mark];
##其他代码
}
您可以阅读中各种功能的文档
这段代码将通过从cat
导入管道的相当谨慎的方式打开一个文件进行读取,而不是简单地打开文件。|
意味着shell命令cat
通过管道传输到open命令,我们的文件句柄将从输出中读取
|
是简单的或。打开管道,如果失败,程序将终止
while()。然后在下面的替换和拆分中隐式使用该行。也就是说,s/^\s+/
等于$\u=~s/^\s+/
,split
等于split(“”,$)
将删除前导空格。拆分将在空白处拆分每一行,元素存储在数组@line
中
由于对空格使用隐式拆分,因此实际上不需要使用s/^\s+/
剥离前导空格,因为这是自动完成的
如果第一个元素不包含冒号:
,$mark
设置为0。否则,它不会被设置,并且可能会使用上一次迭代中的值,因为它没有在循环中定义。最后,$var
被初始化为元素编号$mark
,它可以是0或其他值
ETA:作为一个相当隐蔽的oops:如果$mark
未定义,即它不包含冒号,那么$var
仍将被分配$line[0]
,因为未定义的将转换为0
,并带有警告。如果use warnings
无效,则此错误是无声的,因此是隐蔽的
这段代码似乎是由不太了解perl的人编写的,使用起来可能不太安全。您可以阅读中各种函数的文档
这段代码将通过从cat
导入管道的相当谨慎的方式打开一个文件进行读取,而不是简单地打开文件。|
意味着shell命令cat
通过管道传输到open命令,我们的文件句柄将从输出中读取
|
是简单的或。打开管道,如果失败,程序将终止
while()。然后在下面的替换和拆分中隐式使用该行。也就是说,s/^\s+/
等于$\u=~s/^\s+/
,split
等于split(“”,$)
将删除前导空格。拆分将在空白处拆分每一行,元素存储在数组@line
中
由于对空格使用隐式拆分,因此实际上不需要使用s/^\s+/
剥离前导空格,因为这是自动完成的
如果第一个元素不包含冒号:
,$mark
设置为0。否则,它不会被设置,并且可能会使用上一次迭代中的值,因为它没有在循环中定义。最后,$var
被初始化为元素编号$mark
,它可以是0或其他值
ETA:作为一个相当隐蔽的oops:如果$mark
未定义,即它不包含冒号,那么$var
仍将被分配$line[0]
,因为未定义的将转换为0
,并带有警告。如果use warnings
无效,则此错误是无声的,因此是隐蔽的
这段代码似乎是由对perl不太了解的人编写的,使用起来可能不太安全。替换会修剪行()开头的前导,将所有非空白字符保留为第一个
在open…||模具…
是高优先级的或。如果失败,则执行
open(文件,“cat$fileName |”)是对外部进程的浪费。要读取文件进行输入,只需执行以下操作:
open FILE, '<', $filename or die qq{Could not open "$filename" for reading: $!};
这个文件句柄被分配给一个词法变量,该变量只存在于它声明的范围内。一旦程序流退出此作用域,文件将自动关闭。替换将修剪行()开头出现的前导,将所有非空白字符保留为第一个
在open…||模具…
是高优先级的或。如果失败,则执行
open(文件,“cat$fileName |”)是对外部进程的浪费。要读取文件进行输入,只需执行以下操作:
open FILE, '<', $filename or die qq{Could not open "$filename" for reading: $!};
这个文件句柄被分配给一个词法变量,该变量只存在于它声明的范围内。一旦程序流退出此作用域,文件将自动关闭。部分混淆在于开发人员正在使用默认变量$\ucode>。当您没有在函数中指定变量的名称时,许多Perl命令(我会说大约有1/3)会作用于$\uu
。例如,它们在语法上是相同的:
my $uppercase_name = uc($_);
my $uppercase_name = uc;
print $_;
print;
在这两种情况下,uc
函数将以大写字符打印$\ucode>变量中的字符串。事实上,即使是print
语句也使用$\ucode>变量。同样,它们都是相同的:
my $uppercase_name = uc($_);
my $uppercase_name = uc;
print $_;
print;
它皱着眉头
open(FILE, "cat $fileName |") || die "could not open file";
while ($_ = <FILE>)
{
$_ =~ s/^\s+//;
my @line = split $_;
if ($line[0] !~ /\:/) {
$mark = 0;
}
my $var = $line[$mark];
## some other code
}
if (not open(FILE, "cat $fileName |")) {
die "could not open file";
}
open(FILE, "cat $fileName |") or die "could not open file";
open (COMMAND, "java -jar foo.war|") or die "Can't execute 'java -jar foo.war'";
open (MAIL, "|mail $recipient") or die "Can't mail $recipient";
print MAIL "Dear $recipient\n\n";
print MAIL "I hope everything is well.\n";
print MAIL "Sincerely,\n\nDavid";
close MAIL;
s/^\s+//;
$_ =~ s/^\s+//;