我有一个像阵列("值a","VALUEB","valueC","价值")等.我要循环的数组的值从(例如)"valueC"的第一个实例开始.应该忽略值"valueC"的第一个实例之前的数组中的所有内容; 所以在这种情况下,循环只处理"valueC"和"valueD".
我可以在我的循环中放置一个条件,但是有一种更简洁的方式来表达使用perl的想法吗?
是否可以使用"括号"语法将代码块传递给子代码?
即我写的时候
List::MoreUtils::any { defined ($_) } (undef, undef, 1);
有用.但是当我尝试添加括号时
List::MoreUtils::any ( { defined ($_) } , (undef, undef, 1) );
这被解释为匿名哈希,给出错误消息.无论是逃避还是使用eval都无济于事.
所有大惊小怪的想法是如果调用是表达式的一部分,即
if (first_index { defined (${$_})} $jms_positions > $jms_positionals_seen )
参数之后的某些运算符可能会在调用之前执行,从而产生不需要的结果.
我想停用环境变量并从@INC中删除附加的/ home/myusername/perl5 ..目录,这些目录是Local :: Lib的结果.任何人都可以建议吗?我真的想在Local :: Lib之前回到perl ENV vars和@INC文件夹的状态.我在Fedora 16上.
我正在尝试使用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});
config.pl
# Configuration file for main script
(
  username => "username",
  password => "none_of_your_business",
  favorite_color => "0x0000FF",
);
阅读Perldocdo提供了很多关于相对路径的有用建议 - 搜索@INC和修改%INC,关于5.26不搜索"."的特殊警告.更多,等等.但它也有这些位:
#加载确切的指定文件(./和../ special-cased) ...
使用do与相对路径(./和../除外),如...
然后它实际上从来没有麻烦解释"./"或"../"的特殊情况路径处理 - 一个重要的遗漏!
所以我的问题是" 当你真正发生了什么"时的所有变化do './file.pl';?例如...
任何见解都表示赞赏.
问题在符号和变量名之间是否应该忽略空格?得到肯定的回答。
这是什么原因Perl的解释$ foo为$foo?
perl -w -E 'my $  foo = $$; say  "Perl $]\n\$ foo = ", $foo'
Perl 5.028001
$ foo = 3492
它不是针对“变量名语法”文档吗?
我想让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 {
....
}
/ usr/lib/perl5/lib/DBI被添加到我的bash配置文件中的PATH环境变量中,它被许多脚本使用,因此我无法禁用它.
像C这里有gcc,borland和更多编译器可用,我想知道是否有其他编译器/口译员可用于Perl 5?
从我的阅读中,我理解有perlcc将代码编译成B:OP格式,然后使用解释器将optree转换为机器可执行文件.
我正在努力了解如何perl处理shebang线.
我曾经认为命令行中"命令位置"中提到的任何解释器都优先于shebang行中提到的解释器.例如,如果调用的可执行脚本demo看起来像这样
#!/usr/local/bin/perl-5.00503
printf "$]\n";
...然后我会观察以下内容:
$ ./demo
5.00503
% /usr/local/bin/perl-5.22 ./demo
5.022003
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
AFAICT,这种特殊行为似乎是有限的perl口译员; 非perl翻译,例如/bin/bash,"否定"shebang:
% /bin/bash ./demo-wc
$]
最重要的是,perl根据所提到的翻译,处理shebang似乎有完全不同的政策.
perl确定要遵循的政策?#!/usr/bin/perl
sub f { {
  a => 1,
  b => 2
} }
sub g { {
  %{f()},
  c => 3,
  d => 4,
} }
use Data::Dumper;
print Dumper g();
上面的代码输出
$VAR1 = 'a';
$VAR2 = 1;
$VAR3 = 'b';
$VAR4 = 2;
$VAR5 = 'c';
$VAR6 = 3;
$VAR7 = 'd';
$VAR8 = 4;
尽管我理解它应该输出
$VAR1 = {
          'a' => 1,
          'c' => 3,
          'b' => 2,
          'd' => 4
        };
我的误会是什么?
我正在尝试使用单行代码,根据行本身字段的内容,将从输入源读取的行写入不同的文件。
我的方法是使用散列来存储文件句柄,以避免多次打开相同的文件,一旦在读取的新行中找到了以前未出现过的字段的值,就动态向该散列添加键。
但是,使用存储文件句柄的哈希值和常见的print / printf调用,例如
print $hash{ $field_value } "String"
导致编译错误。更换$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 …