【问题标题】:How to pass local variable as the `while` condition如何将局部变量作为“while”条件传递
【发布时间】:2017-06-22 06:19:08
【问题描述】:

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

我该怎么做?

我的代码:

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

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

我该怎么做?

文件句柄还有其他方法吗?

输入文件:$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

【问题讨论】:

  • 您使用$result = ""; 行为$result 分配一个空字符串。然后你试图从中读取?这是一个空字符串。它甚至不是一个有效的文件句柄。如果您的@data 包含文件句柄,只需删除$result = ""; 看看会发生什么。如果@data 确实 not 实际上有文件句柄,那么我不知道您要做什么,请解释一下。
  • 你为什么要做while ($result)或类似的事情? $result 只是一个包含字符串的标量。只需执行for my $result( @data ){ print "result = $result\n" } 而不是实际的for 循环,它将打印$result 的值。此外,您是否意识到@data 从不包含两个以上的元素?另外,$out 是什么?
  • 另外,我最近看到一两个类似的问题;请问您在学习教程/书籍时是否遇到此问题?如果有,是哪一个?
  • @salar33:好的,我已经整理了你的代码,以便我可以阅读它,很明显它不会编译。您从不声明$output,您对File::Find::Rule 的调用是错误的,并且您有一个无效的while ( ... ) { ... } else { ... } 构造。请出示您的真实代码。
  • @salar33:不,你没有。您的代码仍然是随机的废话,甚至无法编译。

标签: perl


【解决方案1】:

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 行,“$line)”附近的语法错误

所以你甚至没有给我们编译代码。

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

所以恐怕我现在要放弃了。我会找到不浪费我时间的人来帮助他们。

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

【讨论】:

  • 为什么使用文件句柄作为 @Dave Cross
  • 你还没有在任何地方打开它@Dave Cross
  • 以及为什么你给了不同的文件句柄@Dave Cross
  • 我使用了 DATA,因为它是一种在程序中包含数据且无需使用单独文件的便捷方式。我没有打开它,因为它是一个已经为你打开的特殊文件句柄。
  • 这不是关于大括号,而是关于括号。此行仍在您的代码中:my @data=split/:/,$line);。在这一点上,我将停止回复你。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    相关资源
    最近更新 更多