Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 处理输入文件的代码段的问题_Perl - Fatal编程技术网

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]; ##其他代码 } 您可以阅读中各种功能

我正在学习一个Perl程序,其中包括以下用于处理输入文件的部分。我不明白什么是
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+//;