10

当我说简单时,我的意思是,在一个表达式中,这样我就可以将它作为一个值粘贴到散列中,而无需先准备它。我会发布我的解决方案,但我正在寻找一个更好的解决方案,让我想起更少的 VB。:)

4

4 回答 4

29

怎么样

( split /\n/, $s )[0]

?

您不必担心 \n 不是跨平台的,因为Perl 足够聪明,可以解决这个问题

于 2009-01-09T13:54:57.390 回答
4

这并不像你喜欢的那么简单,但为了简短而简单不应该总是成为目标。

您可以在字符串上打开文件句柄(作为标量引用)并将其视为文件以读取第一行:

我的 $string = "弗雷德\n威尔玛\贝蒂\n";
打开 my($fh), "<", \$string 或死...; # 从 $string 中读取数据
我的 $first_line = <$fh>; # 给出“弗雷德”
关闭 $fh;

如果你真的想,我想你可以把它简化为一个表达式:

$hash{$key} = do { open my($fh), "<", \$string; scalar <$fh> };

无论您选择哪种方法,您始终可以创建一个子程序来返回第一行,然后在您的哈希分配中使用子程序调用。

子 gimme_first_line { ... }

$hash{$key} = gimme_first_line(\$string);
于 2009-01-09T21:17:29.930 回答
2
($str =~ /\A(.*?)$/ms)[0];

对于大字符串,这将比

(split /\n/, $str)[0]

正如曼尼建议的那样。[编辑:删除了对 . 的错误提及split /\n/, $str, 1。]

如果要包含终端\n(如果存在),\n?请在正则表达式中的右括号之前添加。

于 2009-01-10T09:37:02.560 回答
0
substr($s, 0, index($s, $/) > -1 ? index($s, $/) || () )
于 2009-01-09T13:42:20.660 回答