map {lc}不适用于数组

Tem*_*jin 0 arrays perl

我有一个带有单词列表的文件,每个都在新行和大写字母中,如

  • AAA
  • BBB
  • CCC
  • 等等

现在,应该将数组转换为小写但失败的代码出了什么问题:映射数组又是大写的?

#!/usr/bin/perl -w
open(MYFILE, "$ARGV[0]") || die "opening bigList $!";
@Llist=<MYFILE>;
close (MYFILE);

@lc_word = map { lc } @Llist;
print @lc_word;
Run Code Online (Sandbox Code Playgroud)

mir*_*rod 11

这个对我有用.

我按照公认的最佳实践重新编写了代码,因此您不会使用旧式Perl.

#!/usr/bin/perl

use strict;
use warnings;

open( my $in, '<', $ARGV[0]) or die "cannot open '$ARGV[0]': $!";

my @Llist=<$in>;
close ($in);

my @lc_word = map { lc } @Llist;
print @lc_word
Run Code Online (Sandbox Code Playgroud)

附加说明:文件的编码是什么?如果它是纯ASCII,那么这将起作用,否则你需要指定编码open,例如对于utf8文件: open( my $in, '<:utf8', $ARGV[0]).另外,将整个文件放入内存my @Llist=<$in>;中有点不好意思,尽管在这种情况下,无论如何你都会将整个小写列表放在内存中.

如果你想要的是小写初始数组(Llist),那么你需要替换mapwithforeach my $word(@Llist) { $word= lc $word; }

  • 一个更简单的单行:`perl -pe'$ _ = lc'`,这里不需要地图.我假设OP的要求是更大的代码片段的一部分. (2认同)
  • 最佳实践通常包括不显式打开$ ARGV [0],而只是使用<>读取ARGV而没有文件句柄. (2认同)