【问题标题】:perl script on text-files文本文件上的 perl 脚本
【发布时间】:2019-12-08 02:21:47
【问题描述】:

我有一个 PERL 脚本,它应该对文件夹中包含的文本文件执行“某些操作”。从脚本名称我可以猜出应该做什么,但在我看来没有做任何事情(当我从 Windows 上的 git bash shell 执行时,我看不到对文本文件的任何更改)。

我想知道的是,如果在现实中做某事,以及使用另一个 perl 解释器或操作系统的结果是否会有所不同。

#!perl

$|++;

use strict;
use File::Find;
my ($cnt, $uxcnt);

print "Doing something on files on @ARGV ...";

find(\&wanted, @ARGV);

print " done something for ($uxcnt/$cnt) files\n";

sub wanted {
  $cnt++;
  my $file = $_;
  if(-T $file) {
    $uxcnt++;
    open FILE, $file or warn "Warning: Couldn't open $file: $!\n";
    my @buf;
    push @buf, $_ while <FILE>;
    close FILE;
    open FILE, ">$file" or warn "Warning: Couldn't open $file: $!\n";
    binmode FILE;
    print FILE @buf;
    close FILE;
  } 
}

【问题讨论】:

  • 它会做一些奇怪的事情(报告无法打开文件但然后像成功一样继续运行?)以及不推荐使用的旧习语(裸词文件句柄而不是词法,不使用三个参数open,没有use warnings;,等等...至少它有use strict;) 但它看起来的意图是将Windows 行尾转换为Unix 行尾。

标签: file perl text


【解决方案1】:

[更新:正如人们在 cmets 中指出的那样,我在这里遗漏了一些重要的东西 - 在 Windows 上运行时,它会将 Windows (CRLF) 行尾转换为 Unix (LF) ]

它没有任何用处。

它会在命令行中给出的目录下查找它可以找到的所有文件。对于它找到的每个文件,它会判断(或更准确地说,猜测)该文件是否是文本文件。如果文件是文本文件,则它将文件中的所有文本读取到名为@buf 的数组中,然后用@buf 中的数据覆盖文件。

所以基本上它会从它找到的每个文本文件中读取数据,然后将这些数据写回原始文件。

【讨论】:

  • 谢谢!这正是我的想法(但我不知道 perl,所以我问了)。现在脚本的名称是“unixise_dir.pl”,所以,我想应该将某些东西(换行符?)从 windows 转换为 unix 格式(因此我的问题的第二部分)
  • 我不相信我同意这个答案。可能会触发一些魔法,以便在读取文件时完成 dos->unix 转换。如您所知,它仅在 Windows、Mac 或其他平台上运行时才会这样做,而在其他平台上则没有,这就是为什么它似乎什么都不做的原因。脚本的名称强烈暗示了这种解释,我认为它在最初开发的任何地方都有效,如果没有其他地方的话。
  • 在 Windows 系统上,它会将 CRLF 行尾转换为 LF
  • 感谢大家。使用 ActivePerl 在 Windows 上有效地运行脚本我获得了所需的行为:CRLF 被转换为所有文本文件的 LF。使用 Git Bash 控制台中的 perl 解释器在 Windows 上执行时不会发生同样的情况,其中没有转换。
猜你喜欢
  • 2016-03-20
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多