Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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_Variables - Fatal编程技术网

在Perl中创建多行变量

在Perl中创建多行变量,perl,variables,Perl,Variables,下面是我的另一个问题 我有以下代码,我逐行读取网页内容,尝试匹配某个模式,如果匹配,则将其写入文件: foreach my $line (split qr/\R/, $mech->content) { if ($line=~ m/t\/([A-Z]+)/){ print $fileHandle "$1\n"; } } 我想知道是否可以将匹配的行附加到另一个多行变量,并仅在循环完成时将其写入文件 我之所以希望如此,是因为我希望使用以下子例

下面是我的另一个问题

我有以下代码,我逐行读取网页内容,尝试匹配某个模式,如果匹配,则将其写入文件:

foreach my $line (split qr/\R/, $mech->content) {
    if ($line=~ m/t\/([A-Z]+)/){
        print $fileHandle "$1\n";
    }
}
我想知道是否可以将匹配的行附加到另一个多行变量,并仅在循环完成时将其写入文件

我之所以希望如此,是因为我希望使用以下子例程将数据保存到文件中,而不是直接执行此操作:

writeToFile("fileName.tmp","path",data);
这是我编写的一个子例程,它除了将数据保存在文件中外,还检查以下内容:

  • 指定的路径是否已存在(并在需要时创建)
  • 如果文件已存在于磁盘上,请将其与即将写入的文件进行比较(仅当文件不同时才写入)

  • 因此,如果我能够创建这个附加变量,我将少写一个文件到磁盘。

    这很简单-您可以使用
    =
    运算符(这是组合赋值(
    =
    )和串联(
    )来追加字符:


    这很简单-您可以使用
    =
    运算符(即组合赋值(
    =
    )和串联(
    )来追加字符:

  • 您可以通过字符串连接来实现,在循环中,您只需将print替换为

    $data .= "$1\n"; 
    # Same as $data = $data . "$1\n";
    
  • 或者使用Perl的
    映射的魔力来构建多行字符串,而不需要循环或
    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);
    
  • 您可以通过字符串连接来实现,在循环中,您只需将print替换为

    $data .= "$1\n"; 
    # Same as $data = $data . "$1\n";
    
  • 或者使用Perl的
    映射的魔力来构建多行字符串,而不需要循环或
    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);
    
  • 替换

    open(my $fileHandle, ...) or ...;
    
    ...
    
       print $fileHandle "$1\n";
    

    将输出附加到字符串而不是发送到文件句柄。

    只需替换即可

    open(my $fileHandle, ...) or ...;
    
    ...
    
       print $fileHandle "$1\n";
    


    将输出附加到字符串,而不是将其发送到文件句柄。

    我将从中删除。我想这不会有任何魔力(但我不知道),我将从中删除。我想这不会有任何魔力(但我不知道)谢谢你的回答。你能解释一下为什么需要最后一个
    (在
    $line
    之后)吗?@EugeneS-在他的代码中,它需要作为串联运算符。就我个人而言,在我们公司,我总是采用插值而不是串联的方式,例如,
    “$line\n”
    $line更好。”\n
    以我的经验,风格wise@DVK因此,
    只是连接行?@EugeneS-.连接任何字符串。
    $line.\n“
    只是将字符串与换行符连接起来。谢谢您的回答。您能解释一下为什么需要最后一个
    (在
    $line
    之后)吗?@EugeneS-在他的代码中,它是作为串联运算符需要的。就我个人而言,在我们公司,我总是采用一种在串联上使用插值的方式,例如,
    “$line\n”
    $line更好。“\n”
    以我的经验,风格wise@DVK因此,
    只是连接行?@EugeneS-.连接任何字符串。
    $line.\n“
    只是将字符串与换行符连接起来。非常感谢您的详细回答。您能解释一下表达式(数字3)的输出方式吗可以存储到变量/写入文件吗?@EugeneS-请参阅我的更新。表达式3的“输出”只是原始变量本身-正则表达式在Perl中替换为“就地”。女士们,先生们,#3是Perl好的原因。非常感谢您的详细回答。您能解释一下表达式(数字3)的输出方式吗可以存储到变量/写入文件吗?@EugeneS-请参阅我的更新。表达式3的“输出”只是原始变量本身-正则表达式在Perl中替换为“就地”。女士们先生们,Perl之所以好是因为#3。