鉴于以下输入
$ cat pre
stuff MACRO1 stuff MACRO2
stuff MACRO2 stuff MACRO1
stuff MACRO2 stuff
Run Code Online (Sandbox Code Playgroud)
如果MACRO1也存在,我想替换MACRO2(与MACRO3).像这样:
$ perl -ne '/(?=.*MACRO1).*MACRO2/ ? print s/MACRO2/MACRO3/gr : print' pre
stuff MACRO1 stuff MACRO3
stuff MACRO3 stuff MACRO1
stuff MACRO2 stuff
Run Code Online (Sandbox Code Playgroud)
(我想.*MACRO2
这个表达式的一部分是不必要的,现在我考虑一下)编辑.到目前为止,基于反馈的上述不太愚蠢的版本:
$ perl -ne '/MACRO1/ ? print s/MACRO2/MACRO3/gr : print' pre
Run Code Online (Sandbox Code Playgroud)
我想弄清楚的是如何只使用正则表达式来做到这一点.这是一次尝试:
$ perl -ne 'print s/(?=.*MACRO1)(?=.*MACRO2)MACRO2/MACRO3/gr' pre
stuff MACRO1 stuff MACRO2
stuff MACRO3 stuff MACRO1
stuff MACRO2 stuff
Run Code Online (Sandbox Code Playgroud)
我认为我对前瞻操作员如何同时成为"锚"和"非消费"都有一些根本的困惑.如果我把?=
它想象成一个锚点,那对我来说上述不起作用是有意义的.但这似乎与"非消费"相矛盾.
任何人都可以定义非消费的含义,并向我展示一个可以产生预期结果的正则表达式吗?
所以,我的理解是下面的代码:
somestruct_t a = {0};
somestruct_t b;
b = a;
Run Code Online (Sandbox Code Playgroud)
如果可能的话,总是优于:
somestruct_t a;
somestruct_t b;
memset(&a, 0, sizeof(a));
memcpy(&b, &a, sizeof(a));
Run Code Online (Sandbox Code Playgroud)
顶级构造几乎总是可能的......这引出了我的问题:由于顶级代码都表现良好,并且对我来说显然对于学习该语言的人来说更直观,为什么memset
和memcpy
模式在 C 和 中如此令人惊讶地普遍存在甚至是非 OO C++ 代码?事实上,我几十年来从事的每个项目都更喜欢底部图案。
我假设有一些历史原因,例如非常旧的编译器不支持它或类似的东西,但我非常想知道具体原因。
我知道一般历史问题是题外话,但这是关于一个非常具体的不良做法,我想更好地理解。
编辑我并不是想断言 memcpy 和 memset 一般来说是不好的。我正在谈论单个结构的赋值或初始化的非常具体的使用模式。
好的,这个脚本的预期“输出”是相当明显的,它可以工作。它复制文件:
Get-ChildItem -Recurse -Directory | ForEach-Object{
if ($_.Name.ToUpper().Contains("INCLUDE_PUBLIC")){
Get-ChildItem -Recurse -File -Include "*.h" -Path $_.FullName | ForEach-Object {Copy-Item ($_.FullName) ("e:\IncTest")}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我将左大括号{
移到下一行,则会得到以下输出:
cmdlet ForEach-Object at command pipeline position 2
Supply values for the following parameters:
Process[0]:
Run Code Online (Sandbox Code Playgroud)
我是否被其他一些语法问题欺骗了,或者 ForEach-Object 是否要求它的大括号在同一行上?
我已经成功地重现了我在一个更大的项目中遇到的问题。我认为这是我能做到的最小限度
\n\n关键是我已经明确地将标头添加到源列表中,并且编辑它仍然不会导致任何内容重新编译。
\n\n~/src/test2/_build\xc2\xa3 cat ../CMakeLists.txt\ncmake_minimum_required (VERSION 3.14)\nset (CMAKE_CXX_STANDARD 11)\n# various explicit CXX sets are necessary for this tiny project and don\'t exist in larger original\nproject(moduletest CXX)\nset (HEADER_DIR "${CMAKE_CURRENT_SOURCE_DIR}")\nadd_subdirectory(submod)\nadd_library(moduletest_static STATIC "$<TARGET_OBJECTS:submod>")\nset_target_properties(moduletest_static PROPERTIES LINKER_LANGUAGE CXX)\n\n~/src/test2/_build\xc2\xa3 cat ../submod/CMakeLists.txt\ninclude_directories (${HEADER_DIR})\nadd_library(submod OBJECT compileme.cpp ../includeme.h)\n\n~/src/test2/_build\xc2\xa3 cat ../submod/compileme.cpp\n#include "includeme.h"\nint function()\n{\n return 5;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\nmake输出如下:
\n\n~/src/test2/_build\xc2\xa3 touch ../submod/compileme.cpp\n~/src/test2/_build\xc2\xa3 make\n[ 50%] Building CXX object submod/CMakeFiles/submod.dir/compileme.cpp.o\n[ 50%] Built target submod\n[100%] Linking CXX static library libmoduletest_static.a\n[100%] Built target moduletest_static\n~/src/test2/_build\xc2\xa3 touch ../includeme.h\n~/src/test2/_build\xc2\xa3 make\n[ 50%] Built target submod\n[100%] …
Run Code Online (Sandbox Code Playgroud) 鉴于以下输入:
£ cat problem
Team 7
John: 19
Sue: 20
Pam: 35
Team 42
Jeff: 12
Sam: 3
Phil: 26
Jill: 10
Team 9
Bill: 19
John: 7
Linda: 15
Run Code Online (Sandbox Code Playgroud)
我试图在perl one-liner中重现以下输出:
£ awk '/Team/ {x=$2} /: *[0-9]+/ {myarray[x]+=$2}; END{for (key in myarray) {print "Team " key ": " myarray[key]}}' problem
Team 42: 51
Team 7: 74
Team 9: 41
Run Code Online (Sandbox Code Playgroud)
这个(基本)问题和数据实际上来自perl教程. http://learnperl.scratchcomputing.com/tutorials/csss/
我对接近这个的东西很感兴趣,我已经尝试了......实际上超过50种变体:
£ perl -e 'while(<>){if (/Team/){$x = /(\d+)/;}else{/(\d+)/;$myarray{$x}+= {$1}; }} foreach $key (keys %myarray){print "$key\n";}' problem
Run Code Online (Sandbox Code Playgroud)
我知道1)这些正则表达式没有返回匹配(这+= …
给出以下命令:
git ls-files | xargs perl -i -pe 's/SEARCHTERM/REPLACETERM/g'
Run Code Online (Sandbox Code Playgroud)
现在,作为符号链接的所有perl输出(来自git ls文件)都是目标文件的副本。
我有两个问题:
1)我想我隐约理解为什么会这样,但只是隐约。有人可以详细解释吗?并提出避免这种情况的最佳机制?预期的行为是符号链接目标将成为读取和写入的目标,而不仅仅是读取。
2)是否有更好的通用方法可以在本地git分支上进行搜索和替换?
可能值得一提的是,xargs
当我要确保处理文件的内容而不是文件列表时,我的bash非常基本,只是我的默认goto 。出于其他原因不使用。
鉴于以下(消毒)输入:
Return_t
func()
{
Type<SubType> cursorFeature(true);
while (nDist < 800)
{
Result = Example(&var, 0, cursorFeature); //interested in this because inside loop, and not dereferenced or incremented
if (!(++cursorFeature).NoMoreRecords())
{
if (!BLAH(blah)
&& (otherFunc(&var, &cursorFeature->derefenced, MACRO) != 0))
{
bIsChanged = true;
break;
}
memcpy(&var, &cursorFeature->dereferenced, sizeof(anotherType_t));
}
}
//more stuff
}
}
Run Code Online (Sandbox Code Playgroud)
我有以下正则表达式捕获使用后发生的循环 Type
Type.*<.*>\s*(\w*)[^}]*?(?:while|for)\s*\(.*?\n?.*?(\{(?>[^{}]|(?-1))*\})
Run Code Online (Sandbox Code Playgroud)
https://regex101.com/r/Kr0zQq/3
我还有以下正则表达式,它捕获类型变量的特定用法Type
:
Type.*<.*>\s*(\w*)[\s\S]*?\K(?<!\+\+)\1(?!->|\+\+)
Run Code Online (Sandbox Code Playgroud)
https://regex101.com/r/Kr0zQq/4
我的目标是以某种方式将这些结合起来,最好是组合成一个正则表达式(如果可能的话,我希望能够在VS内部进行搜索).鉴于递归正则表达式的性质,我不确定这是不可能的......我怀疑它不是.如果没有,那么在搜索数百个文件时不会丢失文件名/数字上下文的聪明的东西会很棒.我基本上需要文件名和行号.上下文很棒,但不是必需的.
为了澄清,我想捕获cursorFeature
因为它是类型Type
,然后我想在里面搜索它的使用"loop"{.....}
编辑
只是关于我使用正则表达式解决这个问题的说明.被搜索的代码超过一百万行,跨越由各种编译器编译并由多个构建系统构建的多个项目.例如,使用宏和高级语言功能意味着甚至VS Intellisense 经常错误地编写VS能够编译的代码.和YCM(vim)一样.因此,一个可能过于贪婪的正则表达式,即70%的误报是好的.(由于缺少循环中变量使用的进一步发生,因为在那一点上通常很容易扫描其余部分.)然而,尝试使用"通用"PCRE作为单行进行这可能是愚蠢的.:)
我有一个看起来像这样的日志文件:
2018/10/08 17:11:28 [debug] 8851#0: *2 Sent 8/8 bytes.
2018/10/08 17:11:28 [debug] 8851#0: *2 Session: Staging 8 bytes in thread buffer.
2018/10/08 17:11:33 [debug] 8851#0: *36 Receiving 8 bytes
2018/10/08 17:11:33 [debug] 8851#0: *36 Session: Staging 8 bytes in thread buffer.
2018/10/08 17:11:33 [debug] 8851#0: *36 Handling TRL request #0001: [GET_REGION_INFO].
2018/10/08 17:11:33 [debug] 8851#0: *36 Sent 8/8 bytes.
2018/10/08 17:11:33 [debug] 8851#0: *36 Finished processing TRL request #0001.
2018/10/08 17:11:33 [debug] 8851#0: *36 GET_REGION_INFO: Staging 99 bytes in thread …
Run Code Online (Sandbox Code Playgroud) 所以,对于我的考试,我必须评估一些C++表达式.这是表达式:
float x=3<<2>>1?4.:.5?6:7>8;
Run Code Online (Sandbox Code Playgroud)
有人可以用文字解释它,因为我无法理解它.所以,我必须将3转换为二进制并将其移位2位.但转换后结果为11.我可能会添加位符号,因此它变为011.并且在位符号之后我可以添加尽可能多的0,因此3 << 2-> 01100.但之后我不能了解一个事情.条件运算符的条件在哪里?:因为我看不到任何东西?谢谢你的建议,帮我解决这个问题:)
我最近编写了一个小的Perl脚本来修剪行末尾的空格并遇到意外行为.我决定在分解行时Perl必须包含行尾字符,因此测试了该理论并获得了更多意外行为. I do not
应该匹配\s+$
或t$
......不是两者兼而有之.非常困惑.任何人都可以开导我吗?
£ cat example
I have space after me
I do not
£ perl -ne 'print if /\s+$/' example
I have a space after me
I do not
£ perl -ne 'print if /t$/' example
I do not
£
Run Code Online (Sandbox Code Playgroud)
PCRE测试仪给出了预期的结果.我也尝试了/m
后缀而没有改变行为.
编辑.完整性:
£ perl -ne 'print if /e$/' example
£
Run Code Online (Sandbox Code Playgroud)
预期的行为与perl -ne 'print if...'
以下相同grep -P
:
£ grep -P '\s+$' example
I have a space after me
£ …
Run Code Online (Sandbox Code Playgroud) 非常简单的问题(我认为)我很惊讶我似乎无法找到答案.所以到目前为止我有以下内容:
£ perl -ne 'print if /ENGPacific Beach\s\s/' 15AM171H0N15000GAJK5 \
| perl -ane 'print "$F[1]|";END{print "\0"}' | xargs -i -0 echo {}
3346|10989|95459|139670|2239329|3195595|3210017|
Run Code Online (Sandbox Code Playgroud)
所以....第一个管道是因为文件是1.5G,所以不进行记录分离最初会大大加快速度.这xargs
部分是为了展示我正在尝试做的事情.这基本上如下
| xargs -i perl --setperlvar pipeContents={} -ane 'print if $F[3] =~ /$pipeContents/' 15AM171H0N15000GAJK5
Run Code Online (Sandbox Code Playgroud)
1)我知道我可以在脚本中使用ARGV.我知道整件事应该只是一个脚本.我们忽略这些位.我的爱-n
无所不知.
2)对不起,我自己也找不到了......我很确定这是非常明显的......虽然我在perldoc做了一些挖掘但没有找到任何东西.
3)我对bash/zsh解决方案感兴趣,该解决方案也强制{}
在perl ticks的中间由shell解释.
所以,假设我正在编写一个函数来使用每个项目的用户提供的回调来设置数组.(我不是,但我想我是,为了一个最小的例子)
我能找到的最干净的方法如下:
#include <functional>
template<typename T, typename Y>
void PopulateArray(std::function<int(Y*)> callback, T &pArray)
{
for (int i = 0; i < sizeof(pArray); ++i)
int x = callback(&pArray[i]);
}
int main()
{
uint64_t myArray[5];
uint64_t myUint = 42;
PopulateArray( (std::function<int(uint64_t*)>) [=](auto x) {*x = myUint; return 0; },
myArray);
}
Run Code Online (Sandbox Code Playgroud)
我上面的代码有两个问题.
1)对于T
数组类型,似乎无法修改参数.(我不能说我想要一个类型的数组T
,这意味着我必须Y
单独声明,即使它们都是相关的uint64_t
.)我更愿意声明一个T
,一个参数是一个指针,T
另一个是一个数组的T
.
2)客户端代码(在main中)被强制转换lambda.更改auto x
为显式类型似乎没有帮助.
是否有#1或#2的解决方案可能使代码更简洁或可读?
代码需要使用gcc,clang和VS进行编译.我认为 C++ 11是我可以使用的最新标准,虽然我对C++ 14解决方案感兴趣,因为这将是升级我们的clang构建过程的问题.我对涉及切换myArray std::array
std::vector …
#include <iostream>
using namespace std;
multiplication() {
int x;
int y;
int sum;
sum = y * x;
cout << "multiplication" << endl;
cout << "enter first number for multiplication: ";
cin >> x;
cout << "enter second number for multiplication: ";
cin >> y;
cout << "your product is: " << sum <<endl;
return 0;
}
void division (){
cout << "division" << endl;
}
void addition (){
int y;
int x;
int sum = x * y;
cin …
Run Code Online (Sandbox Code Playgroud)