在qw中保留白色空间

时间:2013-12-31 14:48:01

标签: perl

有没有办法在qw中保留一些空白?例如:

my @a=qw(1234 John Smith 123 Main St.);

将生成一个包含6个元素的数组。有没有办法,哦,我不知道......逃离白色空间保留一些吗?类似的东西:

my @a=qw(1234 John\ Smith 123\ Main\ St.);

返回3个元素:'1234','John Smith','123 Main St。'?

(仅供参考,我已尝试过以上内容,也有不同的报价组合,但都无济于事)

4 个答案:

答案 0 :(得分:7)

要按换行符分隔:

my @a = split /\n/, <<'END';
1234
John Smith
123 Main St.
END

答案 1 :(得分:6)

不,您无法使用qw保留空格。正如mpapec在评论中提到的那样,qw用于引用单词。以下是一些替代方案:

简单数组

my @a = ('1234', 'John Smith', '123 Main St.');

Heredoc +拆分

my $string = <<'END';
1234
John Smith
123 Main St.
END

my @a = split /\n/, $string;

__ DATA __

my @a = <DATA>;
chomp @a;

__DATA__
1234
John Smith
123 Main St.

{_ 3}}

的多个__DATA__区域

来自同一主题的Inline::Files来自dga。

免责声明:此模块是实验性的。请注意文档中的以下警告:

  

此模块可能会覆盖使用它的文件中的源代码。为了防止这种可能性,强烈建议您使用“安全第一”中描述的-backup选项。

如果你走这条路,要小心。

use Inline::Files;

my @a = <FOO>;
chomp @a;

my @b = <BAR>;
chomp @b;

__FOO__
1234
John Smith
123 Main St.

__BAR__
5678
Jane Doe
456 Anonymous Ln.

外部平面数据文件

将数据硬编码到脚本中通常是一个坏主意,所以一般来说这就是我要去的路线。

data.txt中

1234
John Smith
123 Main St.

的MyScript

open my $fh, "<", "data.txt" or die $!;

my @a = <$fh>;
chomp @a;

close $fh;

外部CSV

data.csv

1234,"John Smith","123 Main St."
5678,"Jane Doe","456 Anonymous Ln."

的MyScript

use Text::CSV;

my $csv = Text::CSV->new() or die Text::CSV->error_diag();

open my $fh, "<", "data.csv" or die $!;

while (my $row = $csv->getline($fh)) { 
    # $row is an arrayref
}
$csv->eof or $csv->error_diag();

close $fh;

关系数据库???

现在我只是在滑稽。我的观点是,这种猫的皮肤不止一种。

答案 2 :(得分:1)

如果您有大量此类记录,请从文本文件中读取它们并使用split()获取记录的各个元素。如果输入文本文件没有正确的列分隔符,那么最好以某种方式修复输入文件(例如,通过修改首先生成它的程序)。如果您使用__DATA__,则仍需要使列分隔符正确。我建议您使用制表符作为列分隔符,但您确定数据中不存在的任何字符都可以。

答案 3 :(得分:0)

有多种方法可以做到这一点。我最喜欢的是选择一个特定的转义序列来替换空格。例如currentprogress

_

或更精细的序列,如my @a = qw(A_B C); y/_/ / for @a;

_SPACE_