【问题标题】:"Invalid argument" when using 3 part open in perl在 perl 中使用 3 部分打开时出现“无效参数”
【发布时间】:2014-02-06 01:24:55
【问题描述】:

我对 perl(和编程,就此而言)非常陌生,所以如果这只是一个愚蠢的错误,我很抱歉。

我正在尝试编写一个脚本,该脚本从 .txt 文件中提取文件列表,打开每个文件,查找与某些正则表达式匹配的行,然后将这些行打印到一个结构中的新文件中,该结构将生成有效的 .csv 文件(使用正则表达式中的捕获组)。

我的脚本适用于英文 UTF-8 文件,但是当它尝试处理非英文文件时,文本数据会在每个字母之间出现空格,并且正则表达式不匹配 - 我猜这是因为它们是以 UTF-16 保存。我的想法是把 open 命令分成三部分,这样它也可以对非英文文件使用 ":encoding(UTF-16)" 参数,但这会导致参数无效错误。事实上,如果不使用由两部分组成的打开命令,我根本无法运行脚本。

这是我的脚本。

use 5.010;
use strict;
use warnings;

use File::Slurp;

my @intfilelist = read_file('filelist_int.txt');

unlink "int_temp.csv";

foreach my $intfile (@intfilelist) {
    open (my $file, "<:encoding(UTF-16)", $intfile) or die "Whoops! $!";
    while (my $line = <$file>) {
        if ($line =~ m/^(\d{3,5})\t(.*)$/) {
            chomp $line;
            open (my $csv, ">>", "int_temp.csv");
            print $csv ("\"$intfile\",\"$1\",\"$2\"\n");
            close $csv;
        }
    }
}

open (my $file, "&lt;:encoding(UTF-16)", $intfile) 更改为open (my $file, $intfile) 会导致脚本工作,但上述非英文文件的问题除外。

就像我说的,我只玩了 2 天 perl,如果我误用了一些术语或忽略了一些明显的东西,很抱歉。感谢任何帮助!

【问题讨论】:

  • 我怀疑open $file, $intfile 有效。尝试将 $intfile 添加到您的 die-message 中,这样您就可以查看它是否是有效的文件名。
  • open $a,$bopen $a, '&lt;', $b 的简写
  • @nkaun:不,没关系。 use 5.010 只要求您运行的是版本 10 或更高版本。
  • 不确定这是否真的是问题所在,但read_file 也很糟糕。您可以在open 之前尝试chomp $intfile; 吗?
  • 我想补充一句:欢迎来到 Stack Overflow。您使用 Perl 真是太好了,这是一个非常好的第一个问题,即使您是从 cmets 中发现的。保持这个! :)

标签: perl encoding


【解决方案1】:

删除您从带有File::Slurp 的第一个文件中读取的文件名末尾的换行符。您可以在 open 之前使用 chomp $intfile; 执行此操作。

chomp(参见Perldoc Chomp)从给定字符串的末尾删除换行符。

【讨论】:

  • 我发现了同样的事情。使用 chomp 剥离每个 $intfile 上的 EOL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 2018-07-05
  • 2012-12-05
  • 1970-01-01
相关资源
最近更新 更多