如何将局部变量作为`while`条件

时间:2017-06-22 06:19:08

标签: perl

在我的代码中,我尝试在$result循环条件中传递变量while

我该怎么做?

我的代码:

use strict;
use warnings;
use File::Find::Rule;
my $output="/data/file.txt";
my @files=File::Find::Rule->file ->in($output);
foreach my $file(@files)
{
    my ($file)=~m|(.*)|;
    my $outfile="$file.txt";
    open my $fh_out,'>',$outfile or die "error";
    open my $fh,'<',$file or die "error";
    while(my $line=<$fh>)
         {
           my @data=split/:/,$line);
           for my $result(@data)
               {
                if(-f $outfile)
                   {
                    open my $fh1,'<',$result || die "$!";
                    $result=~s/("\S+|\S+")\s*/$1/g;

                    while($result)##Note:Error at this part $result from local variable should pass as loop condition.Then only it will print $result statement inside the while loop.Now the print $result is not printing.
                        {
                        $result.=$_;
                        print $result;
                        }
                       push @data,$fh1;
                      }
                }
          }
   }

在我的代码@data中,内容可以存储为本地变量$result

现在应在$result条件中使用相同的while内容。

我该怎么做?

有没有其他方法可以使用文件句柄?

输入文件:$file

sync_logic : a
symbol1: b
symbol2: c
symbol3: d

@data将包含以下内容

'sync_logic', 'a'
'symbol1',    'b'
'symbol2',    'c'
'symbol3',    'd'

$result的预期输出应如下

sync_logic a
symbol1 b
symbol2 c
symbol3 d

错误:

I got the following error message when i run the above code:

Killed

2 个答案:

答案 0 :(得分:2)

yesterday's question一样,它真的不清楚你要做什么。

为了理解这里发生的事情,我采用了处理一个文件并转换它的代码部分,以便从DATA文件句柄中读取数据。清理你的奇怪格式给了我这段代码:

#!/usr/bin/perl

use strict;
use warnings;

my $outfile = 'test.txt';

while (my $line = <DATA>) {
  my @data = split/:/,$line);
  for my $result (@data) {
    if (-f $outfile) {
      open my $fh, '<', $result || die "$!";
      $result=~s/("\S+|\s+")\s*/$1/g;

      while ($result) {
        $result .= $_;
        print $result;
      }
      push @data, $fh;
    }
  }
}

__DATA__
sync_logic : a
symbol1: b
symbol2: c
symbol3: d

运行这个,给了我一个错误:

  test.pl第9行的

语法错误,接近&#34; $ line)&#34;

所以你甚至不给我们编译的代码。

看。成为优秀程序员的一个重要部分是注重细节。如果您与人共享代码,希望他们会为您查看代码并帮助您找到问题,那么您需要为他们提供可以运行的代码。在与我们共享示例代码之前,您需要对其进行测试并确保其编译。不要只是在SO编辑器中动态编辑代码,并期望它仍然可以工作。我们不想花时间修复您的拼写错误 - 我们希望帮助您解决代码中的实际问题。

所以我担心我会放弃这一点。我会找人帮忙,不要浪费我的时间。

(并且,是的,我知道这不是问题的严格答案,所以我希望被投票或者标记答案。但是虽然它不是问题的答案,我确实认为salar33需要听到的有用信息。)

答案 1 :(得分:1)

从您的预期输出中,您似乎只想从每行中删除冒号:。这看起来像这样

use strict;
use warnings 'all';

my $file = 'test.txt';

open my $fh, '<', $file or die "Can't open $file: $!";

while ( my $line = <$fh> ) {

    chomp $line;

    my @data = split /\s*:\s*/, $line;
    print join(' ', @data), "\n";
}

根据您在问题中显示的输入数据,产生此输出

输出

sync_logic a
symbol1 b
symbol2 c
symbol3 d