小编Ful*_*pin的帖子

Perl钻石运算符是否迭代非魔术数组(不是@ARGV)?

我不认为以下内容应该有效,但确实如此:

$ perl -e '@a = qw/1222 2 3/; while (<@a>) { print $_ ."\n";}'
1222
2
3
$
Run Code Online (Sandbox Code Playgroud)

据我所知,Perl的<>操作员应该使用文件句柄,全局等工作,除了文字<>(而不是<FILEHANDLE>),它会神奇地迭代@ARGV.

有谁知道它是否应该像我在测试中那样工作?

arrays perl diamond-operator

5
推荐指数
1
解决办法
620
查看次数

Perl m //运算符莫名其妙地无法匹配简单的正则表达式

今天,在编写正则表达式以匹配提示输出以便通过IPC :: RUN与程序交互时,我遇到了一个无法解释的匹配简单正则表达式的失败.

$ perl -E 'say "OK" if "mbox user@testdomain.it> " =~ /mbox\s+.*@.*> /s'
$
$ perl -E 'say "OK" if "mbox user@testdomain.it> " =~ /mbox\s+.*@t.*> /s'
OK
$
Run Code Online (Sandbox Code Playgroud)

我认为这可能是插入«@»作为印记的问题,但是

$ perl -E 'say "OK" if "mbox user@testdomain.it> " =~ /mbox\s+.*\@.*> /s'
$
Run Code Online (Sandbox Code Playgroud)

这很简单,我似乎无法理解问题所在.

在Ubuntu 10.4上Perl版本是5.10.1

有任何想法吗?

提前致谢

regex perl pcre

3
推荐指数
1
解决办法
256
查看次数

使用哈希值中存储的文件句柄的语法错误

我正在尝试使用单行代码,根据行本身字段的内容,将从输入源读取的行写入不同的文件。

我的方法是使用散列来存储文件句柄,以避免多次打开相同的文件,一旦在读取的新行中找到了以前未出现过的字段的值,就动态向该散列添加键。

但是,使用存储文件句柄的哈希值和常见的print / printf调用,例如

print $hash{ $field_value } "String"
Run Code Online (Sandbox Code Playgroud)

导致编译错误。更换$hash{ $field_value }STDERR,例如,导致干净的汇编。

下面的示例带有示例单线。

$ cat /tmp/input_file 
mail1.sql:INSERT INTO
mail2.sql:INSERT INTO
mail3.sql:INSERT INTO
mail4.sql:INSERT INTO
mail6.sql:INSERT INTO
mail7.sql:INSERT INTO
mail8.sql:INSERT INTO
mail9.sql:INSERT INTO
maildev.sql:INSERT INTO

$ perl -C -nE '
m{^(?<server>mail[^.]+)\.sql:(?<string>INSERT INTO)};
exists $fd->{$+{server}} or open($fd->{$+{server}}, ">>", "/tmp/". $+{server}.".tmp.sql");
print sprintf(qq{server %s.domain.tld command %s;\n}, $+{server}, $+{string});
' /tmp/input_file 
server mail1.domain.tld command INSERT INTO;
server mail2.domain.tld command INSERT INTO;
server mail3.domain.tld command INSERT INTO;
server mail4.domain.tld command …
Run Code Online (Sandbox Code Playgroud)

perl syntax-error filehandle perl5

2
推荐指数
1
解决办法
41
查看次数

标签 统计

perl ×3

arrays ×1

diamond-operator ×1

filehandle ×1

pcre ×1

perl5 ×1

regex ×1

syntax-error ×1