【问题标题】:How to write result of regular expression variable into new file using perl?如何使用 perl 将正则表达式变量的结果写入新文件?
【发布时间】:2017-11-24 06:32:18
【问题描述】:

从下面的代码中,我想存储正则表达式结果变量的内容(即 $fh 结果到新文件名中)。我该怎么做?

是否有任何可能的方法可以将正则表达式变量输出(即$fh 输出)写入新文件? 这是我的代码:

use strict;
use warnings;
open my $fh,'<',"open.txt" or die "$!";
while(<$fh>)
  {
    $fh=s/("\d+|\d+|")\s*/$1/g;
    print $fh;
  }
close $fh;

错误:

readline() on unopened filehandle 1 at fr.pl line 7.
close() on unopened filehandle 1 at fr.pl line 9.

打开.txt

1
2
3
radio
vendor
version114
version115

输出:

注意: $fh 具有正则表达式值。现在这些 $fh 值应该存储在新文件中并打印如下相同的内容。

radio
vendor
version
version

【问题讨论】:

  • edit您的问题并包括示例输入和输出。你想让我做什么?你的正则表达式很奇怪。您正在捕获 "\d+\d+"(一个双引号)。然后是可选的空白,您将所有这些替换为捕获。您希望$word 成为更改后的行,还是捕获组内的内容?
  • edit your question 修复明显的语法错误(语法突出显示非常清楚!)当您在那里时,您也可以考虑修复缩进。如果您希望大量陌生人阅读和理解您的代码,您可以通过使其尽可能易于理解来帮助他们。
  • 添加了我的输入和输出部分以及错误@DaveCross
  • 你问的问题和上次差不多,问题也一样——你不能像那样“覆盖”一个文件句柄。
  • 想象一下你有一个装满玩具的盒子。您要做的是一次更换一个玩具。你正在做的是拿第一个玩具,把它换成一些新玩具,然后扔掉整个盒子,只保留新玩具。

标签: perl


【解决方案1】:

我不完全确定您要做什么。但我可以看到是什么产生了你的错误。问题是这一行:

$fh=s/("\d+|\d+|")\s*/$1/g;

在执行这行代码之前,$fh 包含您从中读取数据的文件句柄。但是使用这行代码,您可以用替换的结果覆盖该值。这要么是进行的替换次数(这是一个整数),要么是一个空字符串(如果替换失败)。在这两种情况下,$fh 将不再包含您的文件句柄。

所以在循环的第一次迭代结束时,$fh 不再包含文件句柄。因此,当您在第二次迭代开始时执行 while (&lt;$fh&gt;) 时,将会失败(因为正如错误所说,$fh 不是打开的文件句柄)。该读取失败并跳过循环。执行的下一行是调用close()。这也因完全相同的原因而失败。

我完全不确定你认为那行代码在做什么。但它实际上所做的是破坏你的程序:-)

更新:我怀疑此时阅读(更重要的是,理解)Perl 常见问题解答How do I change, delete, or insert a line in a file, or append to the beginning of a file? 将是一种非常有益的利用时间。您似乎不了解基本文件操作的工作原理。

【讨论】:

  • 我想我想使用该正则表达式从文件中删除所有数字。删除数字后,输出应以新文件名写入。 @戴夫克罗斯
  • @salar33:好的。为什么你认为覆盖你的文件句柄是实现这一目标的好方法?
  • 因为我想使用相同的文件句柄并在这种情况下执行一些其他操作,所以我觉得如果它覆盖相同的文件句柄会更好。@Dave Cross
  • @salar33:但是,您正在用整数覆盖文件句柄。那永远行不通。
  • 那我该如何通过覆盖相同的文件句柄并使用相同的文件句柄将其内容保存在新文件名中。 @DaveCross
猜你喜欢
  • 1970-01-01
  • 2017-04-14
  • 2015-07-24
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多