我想获得一个包含模块的完整文件名.考虑以下代码:
package MyTest;
my $path = join '/', split /::/, __PACKAGE__;
$path .= ".pm";
print "$INC{$path}\n";
1;
Run Code Online (Sandbox Code Playgroud)
$ perl -Ipath/to/module -MMyTest -e0
path/to/module/MyTest.pm
Run Code Online (Sandbox Code Playgroud)
它适用于所有平台吗?
perlvar
散列
%INC包含用于通过附带的每个文件名的条目do,require或者use运营商.键是您指定的文件名(模块名称转换为路径名),值是找到的文件的位置.
这些密钥是否依赖于平台?我应该使用File::Spec什么?至少在win32上使用ActivePerl /代替\.
更新:%INC价值观怎么样?它们是平台依赖的吗?
我使用的壳工作,试图找到一堆CSV文件NUL字符(Python的CSV进口商是哀一下,不过那是另一个时间),所以骄傲 - 的 - 我 - 不断巧妙自:
find ~/path/ -name "*.csv" -print0 | \
xargs -n 1 -0 \
perl -ne 'if(m/\x{00}/){print fileno(ARGV).join(" ",@ARGV).$_;}'
Run Code Online (Sandbox Code Playgroud)
除了我看不到文件名.据称,包含perl -ne我的脚本的隐式<>运算符只是使用@ARGV/ ARGVfilehandle,但上面的两个都没有给我当前文件的名称.
如何查看上面的当前文件名(以及理想情况下的行号)?
因为我使用$ _很多,我想更好地理解它的用法.就我所理解和使用它而言,$ _是隐含值的全局变量.
因为$ _似乎是设置的,除了可读性之外,有没有理由在$ _上使用命名循环变量?
在什么情况下,重要的是_ _是一个全局变量?
所以,如果我使用
for (@array){
print $_;
}
Run Code Online (Sandbox Code Playgroud)
甚至
print $_ for @array;
Run Code Online (Sandbox Code Playgroud)
它具有相同的效果
for my $var (@array){
print $var;
}
Run Code Online (Sandbox Code Playgroud)
但它的工作方式是否相同?我想这不完全是,但实际的差异是什么?
更新:
在这个例子中,似乎$ _甚至是正确的范围.它不再是全球性的吗?我正在使用5.12.3.
#!/usr/bin/perl
use strict;
use warnings;
my @array = qw/one two three four/;
my @other_array = qw/1 2 3 4/;
for (@array){
for (@other_array){
print $_;
}
print $_;
}
Run Code Online (Sandbox Code Playgroud)
正确打印1234one1234two1234three1234four.
对于全球$ _我本来预期1234 4 1234 4 1234 4 1234 4 ..或者我错过了一些明显的东西?
什么时候是$ _ global呢?
更新 …
我有以下方法接受变量,然后显示数据库中的信息:
sub showResult {
if (@_ == 2) {
my @results = dbGetResults($_[0]);
if (@results) {
foreach (@results) {
print "$count - $_[1] (ID: $_[0])\n";
}
} else {
print "\n\nNo results found";
}
}
}
Run Code Online (Sandbox Code Playgroud)
一切正常,除了foreach循环中的打印线.此$ _变量仍包含传递给方法的值.
无论如何要在$ _上"强制"新的值范围,还是它总是包含原始值?
如果有任何好的教程可以解释$ _的工作范围,那也很酷!
谢谢
我正在看这个问题,当我在玩耍时,我遇到了这个问题:
#! /usr/bin/env perl
#
# use warnings;
use strict;
use feature qw(say);
{
our $foo = "bar";
say "Foo = $foo";
}
say "Foo = $foo"; # This is line #12
Run Code Online (Sandbox Code Playgroud)
是的,我确实use warnings;关掉了......
当我运行这个时,我得到:
Variable "$foo" is not imported at ./test.pl line 12.
Global symbol "$foo" requires explicit package name at ./test.pl line 12.
Execution of ./test.pl aborted due to compilation errors.
Run Code Online (Sandbox Code Playgroud)
嗯...我得到相同的" 变量"$ foo"不会导入./test.pl第12行. "如果我已经完成错误my $foo = "bar";.我使用时会理解这一点,my因为$foo一旦离开块就没有变量.但是, …
当我遇到这个时,我正在读perlvar -
最后一个管道关闭,反引号(``)命令,成功调用wait()或waitpid()或来自system()操作符返回的状态.这只是传统Unix wait()系统调用返回的16位状态字(或者看起来像是这样).因此,子进程的退出值实际上是($?>> 8),而$?&127给出了哪个信号
什么是16位状态字?操作'$?>> 8'表示什么?在我做'$?>> 8'之后,像'512'这样的16位字如何被转换为'2'?