我想在我的无限二进制函数中使用$a和$b变量,就像它完成sort {$a <=> $b} (1, 2, 3)但我无法弄清楚为什么代码
#!/usr/bin/env perl
use strict;
use warnings;
Foo::Bar(sub { $a + $b });
package Foo;
sub Bar {
my ($function) = @_;
for my $i (1, 2, 3) {
local ($a, $b) = ($i, $i);
print $function->() . "\n";
}
}
Run Code Online (Sandbox Code Playgroud)
不起作用.而
#!/usr/bin/env perl
use strict;
use warnings;
Foo::Bar(sub { $_ });
package Foo;
sub Bar {
my ($function) = @_;
for my $i (1, 2, 3) { …Run Code Online (Sandbox Code Playgroud) 我想知道perl的特殊变量的含义$-[0]和$+[0]
我用google搜索,发现它$-代表页面上剩下的行数,$+代表最后一个搜索模式匹配的括号.
但我的问题是正则表达式的背景是什么$-[0]和$+[0]意味着什么.
如果需要代码示例,请告诉我.
我想知道如何在Perl中做我在lisp中常做的事情:
(defvar *verbose-level* 0)
(defun my-function (... &key ((:verbose-level *verbose-level*) *verbose-level*) ...) ...)
Run Code Online (Sandbox Code Playgroud)
这意味着它my-function在当前的详细程度上运行,但我可以将它传递给不同的级别,这也将影响它的所有调用:
(defun f1 (&key ((:verbose-level *verbose-level*) *verbose-level*))
(format t "~S: ~S=~S~%" 'f1 '*verbose-level* *verbose-level*)
(f2 :verbose-level 1)
(format t "~S: ~S=~S~%" 'f1 '*verbose-level* *verbose-level*)
(f2 :verbose-level (1+ *verbose-level*))
(format t "~S: ~S=~S~%" 'f1 '*verbose-level* *verbose-level*))
(defun f2 (&key ((:verbose-level *verbose-level*) *verbose-level*))
(format t "~S: ~S=~S~%" 'f2 '*verbose-level* *verbose-level*))
[17]> (f1)
F1: *VERBOSE-LEVEL*=0
F2: *VERBOSE-LEVEL*=1
F1: *VERBOSE-LEVEL*=0
F2: *VERBOSE-LEVEL*=1
F1: *VERBOSE-LEVEL*=0
NIL
[18]> (f1 :verbose-level 4) …Run Code Online (Sandbox Code Playgroud) 在查看Ruby中的代码时,我偶然发现了这个sintax.代码是:
if __FILE__ == $PROGRAM_NAME
#some code...
end
Run Code Online (Sandbox Code Playgroud)
我想__FILE__是一个变量,它让我知道我所在文件的名称?但那么什么是$PROGRAM_NAMEsimbolize呢?另外,为什么这个if语句是必要的,因为程序可以使用或不使用它?
Perl有不少特殊的变量,例如@F,$!,%!...等,哪里都是Perl的特殊变量记录?
Perl 状态的文档如果使用隐式关闭close,$.则不会重置open.我试图确切地看到这意味着什么,但无法让它发生.这是我的脚本:
use strict;
use warnings;
use autodie;
my @files = qw(test1.txt test2.txt test3.txt);
#try with implicit close
for my $file (@files){
open my $fh, '<', $file;
while(<$fh>){
chomp;
print "line $. is $_\n";
}
#implicit close here
}
Run Code Online (Sandbox Code Playgroud)
以下是所有三个文件的内容:
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
line 9
line 10
Run Code Online (Sandbox Code Playgroud)
因为我没有显式调用close,所以close应该使用隐式(我认为)并且$.不应该重置.但是,当我运行脚本时,我得到这个输出,显示$.重置:
line 1 is line 1 …Run Code Online (Sandbox Code Playgroud) 我用作arg函数的参数名称:
function foo(cmd, arg)
-- etc.
end
Run Code Online (Sandbox Code Playgroud)
我刚刚了解到这是一个特殊的隐藏变量,它在使用变量参数arg时表示参数表:
function foo(bar, baz, ...)
-- `arg` now holds arguments 3 and up
end
Run Code Online (Sandbox Code Playgroud)
arg在我的代码中用作参数名称是否会出现任何问题?
我已经$^I在perl脚本中用于有条件地搜索和替换.我想知道是否$^I在缓冲区中复制文件并在处理缓冲区后将整个缓冲区写回文件,或者在行编辑中.
代码如下
$^I = "";
my $flag = 0;
while ($line = <>) {
if($line=~ m/some string/i) {
$flag = 1;
}
if(!$flag) {
$line =~ s/string/replace/g;
}
}
print $line;
Run Code Online (Sandbox Code Playgroud) FUZZ> (defvar *foo* nil)
*FOO*
FUZZ> (defmacro bar ()
(format t "foo: ~A" *foo*)
`(+ 1 1))
BAR
FUZZ> (defmacro bot ()
(let ((*foo* 17))
`(bar)))
BOT
FUZZ> (bot)
foo: NIL
Run Code Online (Sandbox Code Playgroud)
宏观扩张的心理模型(显然是错误的)表示以下顺序发生:
运行宏扩展bot(绑定*foo*到17),运行宏扩展bar,打印当前值*foo*(正在17),并返回表单(+ 1 1),这不是宏,宏扩展时间现在结束,最后评估表单(+ 1 1),并返回2.
为什么我错了?
有没有一种简单的方法可以做我想做的事情?
我想迭代给bash脚本的参数,例如:
./bash_script file1 file2 file3
Run Code Online (Sandbox Code Playgroud)
$@ 给了我给脚本的所有文件但我如何迭代文件?
我想cat每个文件并删除内容使用awk(我知道如何做到这一点,这是解开包装$@让我感到困惑).