标签: perl5

如何使用perl从第一次出现具有特定值的元素循环数组?

我有一个像阵列("值a","VALUEB","valueC","价值")等.我要循环的数组的值从(例如)"valueC"的第一个实例开始.应该忽略值"valueC"的第一个实例之前的数组中的所有内容; 所以在这种情况下,循环只处理"valueC"和"valueD".

我可以在我的循环中放置一个条件,但是有一种更简洁的方式来表达使用perl的想法吗?

arrays perl loops perl5

4
推荐指数
3
解决办法
265
查看次数

Perl - 将代码块作为括号内的参数传递

是否可以使用"括号"语法将代码块传递给子代码?

即我写的时候

List::MoreUtils::any { defined ($_) } (undef, undef, 1);
Run Code Online (Sandbox Code Playgroud)

有用.但是当我尝试添加括号时

List::MoreUtils::any ( { defined ($_) } , (undef, undef, 1) );
Run Code Online (Sandbox Code Playgroud)

这被解释为匿名哈希,给出错误消息.无论是逃避还是使用eval都无济于事.

所有大惊小怪的想法是如果调用是表达式的一部分,即

if (first_index { defined (${$_})} $jms_positions > $jms_positionals_seen )
Run Code Online (Sandbox Code Playgroud)

参数之后的某些运算符可能会在调用之前执行,从而产生不需要的结果.

perl perlsyn perl5

3
推荐指数
2
解决办法
2334
查看次数

停用和删除Perl Local :: Lib

我想停用环境变量并从@INC中删除附加的/ home/myusername/perl5 ..目录,这些目录是Local :: Lib的结果.任何人都可以建议吗?我真的想在Local :: Lib之前回到perl ENV vars和@INC文件夹的状态.我在Fedora 16上.

perl perl5 locallib

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

Perl"do",相对路径以"."开头.要么 ".."

我正在尝试使用Perl的do EXPR函数作为穷人的配置解析器,使用第二个.pl文件,它只返回一个列表作为配置信息.(我认为这可能是理想的用途do,尤其是因为我可以do or die在我的代码中写" ".这是一个例子:

main.pl

# Go read the config file
my %config = do './config.pl';

# do something with it
$web_object->login($config{username}, $config{password});
Run Code Online (Sandbox Code Playgroud)

config.pl

# Configuration file for main script
(
  username => "username",
  password => "none_of_your_business",
  favorite_color => "0x0000FF",
);
Run Code Online (Sandbox Code Playgroud)

阅读Perldocdo提供了很多关于相对路径的有用建议 - 搜索@INC和修改%INC,关于5.26不搜索"."的特殊警告.更多,等等.但它也有这些位:

#加载确切的指定文件(./和../ special-cased) ...


使用do与相对路径(./和../除外),如...

然后它实际上从来没有麻烦解释"./"或"../"的特殊情况路径处理 - 一个重要的遗漏!

所以我的问题是" 当你真正发生了什么"时的所有变化do './file.pl';?例如...

  • 虽然从@INC中删除了CWD,但这种语法是否仍然适用于5.26?
  • 从哪个角度看是"./":Perl二进制文件,执行的Perl脚本,来自用户shell的CWD,还是别的东西?
  • 是否存在安全隐患?
  • 这比修改@INC和使用基本文件名更好还是更差?

任何见解都表示赞赏.

perl perldoc perl5 perl-core

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

为什么Perl忽略符号名称和变量名称之间的空格?

问题在符号和变量名之间是否应该忽略空格?得到肯定的回答。

这是什么原因Perl的解释$ foo$foo

perl -w -E 'my $  foo = $$; say  "Perl $]\n\$ foo = ", $foo'
Perl 5.028001
$ foo = 3492
Run Code Online (Sandbox Code Playgroud)

它不是针对“变量名语法”文档吗?

perl perl5

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

[perl]如何在我自己的路径中强制perl使用模块?

我想让perl在我自己的路径中使用DBI模块(假设,/ home/users/zdd/perl5/lib/DBI),但是sysem也有一个DBI模块,它是/ usr/lib/perl5/lib/DBI .当我在我的脚本中编写以下代码时,perl使用系统路径是默认的,如何强制它使用我的路径下的那个?

use lib './perl5/lib/DBI';
use DBI;

sub test {
....
}
Run Code Online (Sandbox Code Playgroud)

/ usr/lib/perl5/lib/DBI被添加到我的bash配置文件中的PATH环境变量中,它被许多脚本使用,因此我无法禁用它.

perl dbi perl5

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

Perl 5有哪些可用的编译器/解释器?

像C这里有gcc,borland和更多编译器可用,我想知道是否有其他编译器/口译员可用于Perl 5?

从我的阅读中,我理解有perlcc将代码编译成B:OP格式,然后使用解释器将optree转换为机器可执行文件.

perl perl5

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

Perl如何处理shebang线?

我正在努力了解如何perl处理shebang线.

曾经认为命令行中"命令位置"中提到的任何解释器都优先于shebang行中提到的解释器.例如,如果调用的可执行脚本demo看起来像这样

#!/usr/local/bin/perl-5.00503

printf "$]\n";
Run Code Online (Sandbox Code Playgroud)

...然后我会观察以下内容:

$ ./demo
5.00503
% /usr/local/bin/perl-5.22 ./demo
5.022003
Run Code Online (Sandbox Code Playgroud)

IOW,在第一次执行中,shebang中的解释器是正在运行的解释器,而在第二次执行中,它是在命令行中提到的解释器.到现在为止还挺好.

但是现在,如果我将shebang上的"解释器"更改为类似的东西/usr/bin/wc,那么它总是胜过perl我在命令行中提到的任何解释器:

% cat demo-wc
#!/usr/bin/wc

printf "$]\n";

% ./demo-wc                           # produces the expected behavior
       4       3      31 ./demo-wc
% /usr/local/bin/perl-5.22 ./demo-wc
       4       3      31 ./demo-wc
% /usr/local/bin/perl-5.14 ./demo-wc
       4       3      31 ./demo-wc
Run Code Online (Sandbox Code Playgroud)

AFAICT,这种特殊行为似乎是有限的perl口译员; 非perl翻译,例如/bin/bash,"否定"shebang:

% /bin/bash ./demo-wc
$]
Run Code Online (Sandbox Code Playgroud)

最重要的是,perl根据所提到的翻译,处理shebang似乎有完全不同的政策.


  1. 如何perl确定要遵循的政策?
  2. 两种情况下的政策究竟是什么?

perl shebang perl5

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

Perl哈希不能按预期工作

#!/usr/bin/perl

sub f { {
  a => 1,
  b => 2
} }

sub g { {
  %{f()},
  c => 3,
  d => 4,
} }

use Data::Dumper;
print Dumper g();
Run Code Online (Sandbox Code Playgroud)

上面的代码输出

$VAR1 = 'a';
$VAR2 = 1;
$VAR3 = 'b';
$VAR4 = 2;
$VAR5 = 'c';
$VAR6 = 3;
$VAR7 = 'd';
$VAR8 = 4;
Run Code Online (Sandbox Code Playgroud)

尽管我理解它应该输出

$VAR1 = {
          'a' => 1,
          'c' => 3,
          'b' => 2,
          'd' => 4
        };
Run Code Online (Sandbox Code Playgroud)

我的误会是什么?

perl hashmap perl5

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

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

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

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

但是,使用存储文件句柄的哈希值和常见的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 ×10

perl5 ×10

arrays ×1

dbi ×1

filehandle ×1

hashmap ×1

locallib ×1

loops ×1

perl-core ×1

perldoc ×1

perlsyn ×1

shebang ×1

syntax-error ×1