我收到错误:
panic: attempt to copy freed scalar a121fb4 to a156be8 at ./p.pl line 13.
Run Code Online (Sandbox Code Playgroud)
当我运行以下程序时(p.pl):
use warnings;
use strict;
use Getopt::Long qw(GetOptions);
main(@ARGV);
sub main {
GetOptions ();
print "\@ARGV=@ARGV\n";
my $arg=shift;
}
Run Code Online (Sandbox Code Playgroud)
例如,当使用一个或多个命令行参数时,p.pl 1会出现错误。
这是什么原因呢?
是否可以使用条件项创建数组?
my @a = (1, ($condition) ? 2 : "no-op", 3);
Run Code Online (Sandbox Code Playgroud)
这样"no-op"的功能是这样的,如果$condition是假的,那么我得到列表,(1, 3)但如果$condition是真的,我得到了(1, 2, 3)?
背景:
use strict;
use warnings;
use File::Find::Rule;
my $rule = File::Find::Rule->new();
$rule->or(
$rule->new->name('*.cfg')->prune->discard,
$rule->directory->name("_private.d")->prune->discard,
$rule->new->name('*.t')->prune->discard,
$rule->new->name('*.bak')->prune->discard,
$rule->new->name('.*.bak')->prune->discard,
$rule->new->name('.#*')->prune->discard,
);
my @files = $rule->in(".");
Run Code Online (Sandbox Code Playgroud)
在某些情况下,我想包括该行
$rule->directory->name("_private.d")->prune->discard
Run Code Online (Sandbox Code Playgroud)
在其他情况下,我不想排除目录_private.d..
是否有一种优雅的方法来指定子程序参数的默认值?
目前,我使用以下方法:
use strict;
use warnings;
func1( "arg1", "arg2", opt1 => "first option", opt2 => 0 );
sub func1 {
my ( $arg1, $arg2, %opt ) = @_;
$opt{opt1} //= "no option";
$opt{opt2} //= 1;
$opt{opt3} //= [];
}
Run Code Online (Sandbox Code Playgroud)
当有很多选择时,它看起来有点难看.我宁愿这样做
sub func2 {
my ( $arg1, $arg2, $opt ) = process_args(
opt1 => "no option", opt2 => 1, opt3 => []
);
}
Run Code Online (Sandbox Code Playgroud)
我能想出的最好的方法是:
sub func2 {
my ( $arg1, $arg2, $opt ) = process_args(
\@_, 2, opt1 => "no …Run Code Online (Sandbox Code Playgroud) 我正在尝试下载模块分发存档I18N::Langinfo:
cpan -g I18N::Langinfo
Run Code Online (Sandbox Code Playgroud)
这给了我一个14兆字节的文件perl-5.22.1.tar.bz2.此存档包含5633个文件,其中子文件夹ext/I18N-Langinfo包含我感兴趣的4个文件.
为什么我还要获取所有其他文件?当我下载模块分发存档时,我希望获得该分发中的文件,我对5629其他文件不感兴趣.
有没有办法~/.bashrc从Perl脚本中加载Bash环境变量(通过从Bash shell中获取来定义).具体来说,我感兴趣PERL5LIB的是在Perl脚本的调用者不是bash进程1的子进程的情况下重新加载环境变量.在这种情况下,$ENV{PERL5LIB}将不存在,这将阻止我使用我在主目录中安装的任何模块.
第一次尝试可能是bash使用该-l选项重新运行我自己.这将加载~/.bash_profile,我已设置该文件加载~/.bashrc.
#! /usr/bin/env perl
use strict;
use warnings;
if ( !exists $ENV{PERL5LIB} ) {
exec 'bash', '-lc', $0, @ARGV;
}
else {
# Main program starts here..
}
Run Code Online (Sandbox Code Playgroud)
但是这可能会为PERL5LIB未定义的(意外)情况进入无限循环~/.bashrc.
脚注:
[1]当我尝试google-chrome使用Google Chrome扩展API 编写要从流程中调用的本机主机时,我遇到了这种特殊情况.
检查模块的文档说:
当以下函数返回"帧记录"时,每个记录都是一个命名元组
FrameInfo(frame, filename, lineno, function, code_context, index).元组包含框架对象,文件名,当前行的行号,函数名称,源代码中的上下文行列表以及该列表中当前行的索引.
什么是"框架对象"?我希望使用这个框架对象从调用者的角度获取变量的值globals():
import my_util
a=3
my_util.get_var('a')
Run Code Online (Sandbox Code Playgroud)
和my_util.py
import inspect
def get_var(name):
print(inspect.stack()[1][0])
Run Code Online (Sandbox Code Playgroud) 在Perl 6中,<.before ... >正则表达式的含义是什么?它似乎意味着<?before ... >:
my $str = "Hello";
$str ~~ /<alpha> <?before 'o'>/;
say $/;
$str ~~ /<alpha> <.before 'o'>/;
say $/;
Run Code Online (Sandbox Code Playgroud)
输出:
?l?
alpha => ?l?
?l?
alpha => ?l?
Run Code Online (Sandbox Code Playgroud)
我想澄清一下,因为我看到了一些使用的代码,<.before ...>我不确定它是什么意思.它可能是非法的语法,或者它可能意味着负面的前瞻<!before ...>或积极的前瞻<?before ...>或其他.我知道我可以<alpha>通过在它前面放一个点来制定像非捕获这样的规则<.alpha>,但是对于我来说,因为它们总是无法捕获而对前瞻没有意义.在任何情况下,它应该写<.?before ... >或<.!before ... >区分正面和负面的前瞻?
如何在awk中对数字数组进行排序?考虑“ sortNum.awk”:
{
split($0,a," ")
for (i in a) print a[i]
print "####"
asort(a)
for (i in a) print a[i]
}
Run Code Online (Sandbox Code Playgroud)
与echo "4 3 2 1" | awk -f sortNum.awk给予
1
4
3
2
####
4
1
2
3
Run Code Online (Sandbox Code Playgroud)
我正在使用GNU Awk版本3.1.8。
假设我在Emacs中编辑了t.txt我的主目录中的文件.然后
ESC-: buffer-file-name生成/Home/fcihh/t.txt如何从中提取文件名部分t.txt?
根据这个链接,我以为我应该可以写
ESC-: (file-name-base buffer-file-name).但这会产生错误
Lisp error: (void-function file-name-base)
Run Code Online (Sandbox Code Playgroud)
我在Ubuntu 12.04上使用GNU Emacs 23.3.1.
考虑将一些参数集传递给函数,例如:
awk -vv1="Hello there" -vv2=Bye 'BEGIN {print v1,v2}'
Run Code Online (Sandbox Code Playgroud)
请注意,第一个参数包含空格.输出是:
Hello there Bye
Run Code Online (Sandbox Code Playgroud)
现在,我尝试将参数存储在变量中.首先考虑第一个参数中没有空格的情况:
arg="-vv1=Hello -vv2=Bye"
awk $arg 'BEGIN {print v1,v2}'
Run Code Online (Sandbox Code Playgroud)
这很好用.现在在变量中插入空格:
arg="-vv1='Hello there' -vv2=Bye"
awk $arg 'BEGIN {print v1,v2}'
Run Code Online (Sandbox Code Playgroud)
它给出了错误消息:
awk: there'
awk: ^ invalid char ''' in expression
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
根据到目前为止的评论,我想改进我的问题:考虑arg另一个shell脚本的输出的情况.例如,假设这genArg是一个打印字符串的shell脚本:
"-vv1='Hello there' -vv2=Bye"
Run Code Online (Sandbox Code Playgroud)
到终点站.然后arg收集(在脚本中)像
arg=$(genArg)
Run Code Online (Sandbox Code Playgroud)
接下来我想awk用给定的参数调用:
awk $arg 'BEGIN {print v1,v2}'
Run Code Online (Sandbox Code Playgroud)