多年来,我一直在Perl中编程,不过几年,虽然只是偶尔使用它是我的主要语言.因为我经常在几个月没有写任何perl,所以我非常依赖我的狗耳骆驼书来提醒我如何做事.然而,当我逐字逐句地复制食谱时,这让我感到困扰.这是最令人头疼的问题之一:在第3版Camel的第154页,有一个"修改字符串en passant的例子,其内容如下:
($lotr = $hobbit) =~ s/Bilbo/Frodo/g;
Run Code Online (Sandbox Code Playgroud)
Q1)这里发生了什么?究竟什么是正则表达式运作?
Q2)这种近乎神奇的语法是否需要这样的基本操作:"从$ a中取一个字符串,用正则表达式修改它,将结果放在$ b中"?
Q3)如何使用循环默认变量作为初始字符串来执行此操作?
向Perl梦想家道歉,上面看起来非常自然.
为什么两个打印的数字不同?
#!/usr/bin/env perl
use warnings;
use 5.10.1;
my $sep = '';
my $number = 110110110110111;
$number =~ s/(\d)(?=(?:\d{3})+\b)/$1$sep/g;
say "A: <$number>";
$number =~ s/\Q$sep\E//g;
say "B: <$number>";
Run Code Online (Sandbox Code Playgroud)
输出:
A: <110110110110111>
B: <11111111111>
Run Code Online (Sandbox Code Playgroud) 我正在尝试设置一个函数来重新格式化一个稍后将被连接的字符串.示例字符串如下所示:
Standard_H2_W1_Launch_123x456_S_40K_AB
Run Code Online (Sandbox Code Playgroud)
虽然有时" S "不存在,有时"40K"是"60K"或不存在,"_ AB"也可以是"_CD"或_"EF".最后,所有下划线都需要更改为连字符.最终产品应如下所示:
Standard-H2-W1-Launch-123x456-
Run Code Online (Sandbox Code Playgroud)
我有四个函数,如果一个接一个地运行将负责所有这些:
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A2,"_AB","_"),"_CD","_"),"_EF","_")
=SUBSTITUTE(SUBSTITUTE(B2,"_40K",""),"_60K","")
=SUBSTITUTE(C2,"_S_","_")
=SUBSTITUTE(D2,"_","-")
Run Code Online (Sandbox Code Playgroud)
我已经尝试了将这些组合成一个函数的多种方法,但我对这个级别的excel相对较新,所以我很茫然.无论如何要将所有这些结合起来,以便它在一个单元格中执行另一个命令吗?
如果我想将函数的参数解析为错误或警告,如果参数转换为函数中的data.table,则会发生奇怪的事情:
e <- data.frame(x = 1:10)
### something strange is happening
foo <- function(u) {
u <- data.table(u)
warning(deparse(substitute(u)), " is not a data.table")
u
}
foo(e)
## foo(e)
## x
## 1: 1
## 2: 2
## 3: 3
## 4: 4
## 5: 5
## 6: 6
## 7: 7
## 8: 8
## 9: 9
## 10: 10
## Warning message:
## In foo(e) :
## structure(list(x = 1:10), .Names = "x", row.names = c(NA, -10L), class …Run Code Online (Sandbox Code Playgroud) 假设我在视觉模式中选择了一个单词.我想使用s //在文件中对该单词和该单词的所有其他实例进行替换.有没有办法在部件中使用突出显示的文本s/<here>/stuff/而无需重新键入?
我有一个Asp .Net Web应用程序,其中一些页面继承自基类"BasePage".这个BasePage类继承自System.Web.ui.Page并且我覆盖了Render方法,这样我就可以在将HTML流发送到客户端浏览器之前拦截它.
这是我的Render方法的代码:
protected override void Render(HtmlTextWriter writer){
MemoryStream memoryStream = new MemoryStream();
try
{
using (StreamWriter streamWriter = new StreamWriter(memoryStream))
{
var textWriter = new HtmlTextWriter(streamWriter);
base.Render(textWriter);
textWriter.Flush();
memoryStream.Position = 0;
using (StreamReader reader = new StreamReader(memoryStream))
{
string finalHtml = reader.ReadToEnd();
// Processing filters
finalHtml = FilterManager.ProcessFilters(finalHtml);
// Writing output to client
writer.Write(finalHtml);
reader.Close();
}
}
}
catch(ObjectDisposedException)
{
}
finally
{
memoryStream.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.有用.我没有使用响应过滤功能的原因是我知道它与Post-cache替换不兼容
是.我也想使用outputcache替换.出于测试目的,我在aspx页面中添加了一个小的asp .net控件:
<asp:Substitution runat="server" id="UnCachedArea" methodname="GetFreshDateTime" /> …Run Code Online (Sandbox Code Playgroud) 替代函数以R树的形式创建一个可以解析的语言对象.如何使用列表从头开始创建树,否则将其提供给eval?
# substitute gives a tree representation of the expression
a=1; b=2;
e1 = substitute(a+2*b)
eval(e1) #gives 5 as expected
e1 # is type language
e1[[1]] # this is `+`
e1[[2]] # this is 'a' type symbol
e1[[3]] # this is type language
e1[[3]][[1]] # this is `*` etc....
Run Code Online (Sandbox Code Playgroud)
我想知道如何以e1编程方式重建对象.理想情况下,我创建了一个复杂列表的对象,其中包含正确的对象,也许我会as.language在list对象上调用一些对象.然而,这不起作用.例如:
# how to construct the tree?
eval(list(as.symbol('+'),1,1)) # does not return 2
eval(as.expression(list(as.symbol('+'),1,1))) # does not return 2
Run Code Online (Sandbox Code Playgroud)
一种方法是生成字符串'1 + 1'然后解析它,但是当你首先拥有树时,生成字符串以再次解析它们似乎并不优雅!
eval(parse(text='1+1')) …Run Code Online (Sandbox Code Playgroud) 小例子:
perl -e '$s="aaabbcc";$c=()=$s=~/a/g;print"$c\n$s\n"' (m // g)输出
3
aaabbcc
Run Code Online (Sandbox Code Playgroud)
而perl -e '$s="aaabbcc";$c=()=$s=~s/a/x/g;print"$c\n$s\n"'(s /// g)输出
1
xxxbbcc
Run Code Online (Sandbox Code Playgroud)
我想一次做两件事而不必先匹配:替换并知道替换的数量.显然,/// g不会返回标量上下文中的替换次数 - 与m // g匹配时不同.这可能吗?如果有,怎么样?
perlre,perlvar和perlop没有提供任何帮助(或者我找不到它).
有没有办法在替代中使用相对路径而不是绝对路径?我想写这个,这不起作用:
service {
password = "qwerty"
url = "http://example.com?user=John&password="${password}
}
Run Code Online (Sandbox Code Playgroud)
仅适用于此案例:
service {
password = "qwerty"
url = "http://example.com?user=John&password="${service.password}
}
Run Code Online (Sandbox Code Playgroud) 有没有办法用正则表达式内联替换文本,而不是从变量中取出文本并将其存储在变量中?
我是初学者.我经常发现自己写作
my $foo = $bar;
$foo =~ s/regex/replacement/;
doStuff($foo)
Run Code Online (Sandbox Code Playgroud)
我真的很想写的地方
doStuff($bar->replace(s/regex/replacement/));
Run Code Online (Sandbox Code Playgroud)
或者类似,而不是使用临时变量和三行.
有没有办法做到这一点?显然,当正则表达式足够复杂时,将它拆分出来以便更好地解释是有意义的,但是当它只是s/\s//g用其他变量使代码混乱时感觉是错误的.
substitution ×10
perl ×4
regex ×3
r ×2
asp.net ×1
data.table ×1
eval ×1
excel ×1
nested ×1
outputcache ×1
string ×1
tree ×1
vim ×1