 Hi everyone. Excellent. Okay. Good. We're starting good. So I'm going to talk about pearl five. I say the word pearl often. So whenever I say pearl, imagine I said pearl five, okay? I'm going to talk about five twenty-four. I'm going to talk about five twenty-six. Five twenty-four is already out. It's running. A lot of people don't really know what's in it, so I'm going to talk about that. And I'm going to talk about what we're going to have in five twenty-six, which comes out very, very soon, as in two months. And then I'm going to talk about what might happen in future versions. And I'm going to mention a lot of things that are history, policy, ideas, and hopefully give you kind of the tone that we're trying to get in pearl nowadays. And I think it's very, very crucial, important to hear the way we see it. So let's start with basics. I was told I always need to start with like, who are you? Because like a lot of you are not, don't know. I mean, that's a good thing, but now you do. So I'm Sawyer Epps. You can call me Sawyer. That's the easiest way. And I do a lot of pearl. I enjoy it very much. I write in various languages. Pearl is my favorite. I have a lot of fun with it. Luckily enough, I work at a company that actually pays me to do it. That's even better. And I'm currently the profile punking, which is the role of the kind of like the project lead on the language, which is very odd. It's very heavy. It's very scary. But with people like you, it's a lot of fun too. So it's great. I also am the project lead of a small web framework in Pearl called Dancer 2. And I work at booking.com. And obviously, we're hiring. Is anyone else here hiring? By any chance? Any hands? I got one. Yeah, I think I saw like seven people with we're hiring shirts. Where was this? Now in the room. So there are a few, I mean, one or two. All right. So what I'm going to start with is development. Once a month, we work on a release that collects all of the development that we've done during that month. And then we bundle all of that together, and we throw it out as a development release. We do this every month. And the reason is that we do this in order to collect information about those changes and to see how stable they were, what kind of changes and impacts they've made, and what kind of alterations we want to this. So it's kind of like, I guess nowadays, we call this agile. So it used to be like you work on a workflow for waterfall workflow for like, I don't know, six months. And then you have the product, or you work on it for two years, and then you have the product. We just have it every month. The last one was released two weeks ago by Abigail. And it was 5.25.9, which means that the next one will be 5.25.10. And that will eventually lead to a stable release. So every single month, you get a new set of changes that you can install and you can run. You probably shouldn't, but you can. And when we talk about development, obviously there's a difference. There's development, there's stable. We also do stable releases, which means every so often we collect all of those development changes. We bundle all together, and then we send it off, and that's a new stable release. So how do we get there? Well, we start with a lot of smoking. Now, it comes from Amsterdam, so this might mean more than one thing. But when we talk about smoking in parole, we actually mean testing. That's what we mean. So we do a lot of testing and a lot of smoking. And I guess in Amsterdam, a lot of people are also doing a lot of smoking. And one of the things that we smoke is c-pan. And that's what we see here. And smoking c-pan means not just running our own tests, but instead taking all of c-pan, like all of c-pan, which is huge. It's massive. It's huge with a Y. It's a Trump huge. And huge. And we run all of c-pan, all of its tests, of every distribution that we can against parole, just to see what's going to happen. Like, maybe we broke something. Maybe we broke a module. So then we collect that information, then we decide on it, and maybe we need to change something. Maybe they need to change something. And that's what we do as well. And stable releases come out every single year. So once a year, we take all of these and we throw it out. That is now a new stable version of parole. You can download it. You can run it. You can move your company to it. You can upgrade all of that. There are a lot of ways to install parole. There are a lot of ways to get it. If you're using one of these distribution, GNU-Lenex, or BSD, or Solaris, or HPOX, or ZOS, or Herd, they're all supported. Paral supports a massive amount of operating systems. I'm not sure why, but we do. And it's great. So you can do that. You can also download Strawberry Paral. You can also get ActiveState and has Active Paral. And you can download those and use them. And they're meant for Windows. They're very good. And you can also download and install whatever version you want locally on your machine, on your own. No need for a distribution. Just go to parolebru.pl. This is a domain. That's why it looks like that. And if you go there, you can just download this program. You can curl it straight to your bash, install it. You can run your own parole. You can update to a new version of parole. You can try a development version of parole. What did I say? Did I say something bad? Oh, right. Curve to bash. Curve to bash. Curl to bash. Well, that's one of the ways to install it. Yeah, it's fine. OK. Security, I mean, maybe. OK. Now, we also do a lot of back porting. There are mainly two releases of parole that we support at a given time. Currently, it would be 5.24 and 5.22. We have just released 5.24.1, which means a new version of that stable branch. And 5.22.3, which is a new version of that stable branch. And these collect additional changes that we've done after we've released a stable one. And this includes various things, like maybe we found a new security issue, or maybe we found a new bug fix. That is actually very important. And we'll put all of those in one release. And they usually come out one month after the stable release. So 5.24.1 and 5.22.3 were an odd one due to a security consideration. It took us a bit more time to get it done the way we wanted. And they usually come out like a month after. So 5.24.1 should come out a month after 5.24.0. 5.24.2 will come out a month after. And 5.22.4 will come out, which will be the very interesting, the most confusing combination. It will be 5.24.2 and 5.22.4. OK. So as the first problem of changing my slides to steam, this. We have a lot of considerations when we work on parole and when we develop it and we make changes. Not everyone agrees with us. That is fine. But I want you to know what those are. First, we care about consistency. There are a lot of suggestions, things that people say, oh, we should add this to profile. We should add this to profile. And sometimes we're like, yeah, that's actually a cool thing. But sometimes it's like, that doesn't actually stay consistent with the way parole thinks. You can solve it this way. It will be faster. It makes more sense. This syntax doesn't make sense. This feature actually exists over here. So we try to keep it consistent. One of the biggest things that we try to keep it compatible. Compatibility is very, very, very hard. We strive for it. But sometimes we have to break it. There are some things that are more important than compatibility, like security. Recently, we made a change having to do with security. Not everyone likes it. I do feel bad. But this is much more important to us. Because you may not appreciate that now a line you wrote 17 years ago doesn't work. But at least it might not cost the company $400 million. So it's very important. We try to limit the breakage that we cause. So to have as little as possible. But that is actually not our prime most goal. Our prime goal is to move the language forward. We want to improve. We want to fix. We want to optimize. We want to make it a language you keep using in the future. Not just one that once you had it there, it won't ever change. So nothing will break. So we try to do this while we limit breakage. Doesn't mean it won't happen. But we will be there when it does. So I keep using the word changes. What does it actually mean? OK, let's talk about some changes. I wanted to talk about 524 or 526. So there are a bunch of stuff that happened up until 524. Not everyone knows about them. I really, really like them. I wish I could talk about them. And I can't because this talk is about 524 and about 526. So here are a list of things that I'm not going to talk about. First, I'm not going to talk about Unicode Strings. And what Unicode Strings does is a new pragma, new, not really because it exists before 524 and was improved over time. But basically what it does is add full support of the Unicode semantics to all of the string operations and regex operations, which is very, very useful if you use Unicode, which is nowadays almost everyone. We have custom ops. I'm not going to talk about custom ops. What they allow you to do, which is a shame I couldn't talk about them, is to actually introduce new operations into the op tree, which is really, really wild and fast and interesting. There are also pluggable keywords that allow you to introduce parsing into Perl that you write in Perl, which then Perl will parse using your Perl code in order to run the Perl program. That's kind of cool, right? OK, we can do this. There's current sub. I like current sub. Stephen mentioned in the previous talk, this is an example of a very simple tree printer. Goes over one node, then it goes over the other node. You can write it in different ways. But this is the naive implementation. It's simple. What if we want to make it purely functional? We just play with functions. The problem here, well, as a callback, is that you can clearly see. Does anyone spot the problem? I think we're just, yeah, I had Paul Evans point out the memory leaks last time I used this. Yeah, it closes over a variable that doesn't exist yet, because it's still defining it. So that doesn't work. OK, so what we can do is define that variable and then we can close over it, except this creates a closure in a memory leak. So that's probably not that good either. There are ways to avoid memory leaks using ref counting, so we can just break the ref count. Not a problem. We start with this program. What we do is we have the variable on top. We use this scalar-util function called weaken, which weakens the link between those two references to basically make sure it doesn't recurse into itself. No problem. We weaken it. We have a new variable, and we use that new variable. Except that variable doesn't have a value, so that won't work. So that's not good either. OK, not good. There are other ways to do this. The best way is actually to have a function that receives a function and returns a new function to that function that would work. We get into stuff like y-combinators, things like that. It's kind of confusing. There is a simple way in Perl nowadays. Let's just clean off this gone, this is gone, this is gone. If we call useFeatureCurrentSub, we can just use that variable the way it was and use underscore sub everywhere. And that's it. Isn't that nicer? That's much nicer. It's simpler. You don't have to think. And it will always be the current sub, whether it is a callback or whether it's just the sub with a name. You don't even have to care. It's nice. I love this thing. I wish I could talk about it. OK, fold case. Has anyone actually, who here speaks a foreign language? In foreign, I mean anything that Americans consider foreign, not English. Pretty much everyone, including an American here. So Unicode is hard because characters don't act the way we assume they act in English. They act in different ways in other languages. For example, in German, if you try to do something like this, that won't work. Because German has multiple characters for the same thing. And it's tricky. And that won't work. You can't just lower case 2 when it's the same one. You might have another character. That's false. You couldn't uppercase it either. There is a correct way to do this in Pro 5. The red X-engine is Unicode aware, which fully understands the concept of Unicode. So if you say this is a character and this is a character, it actually knows whether it's the same one. So you could do that. What we need to do is first to quote it. So this says quote, and this says end quote, which basically means if this has any regex characters in them, don't turn it into a compound regex. It's just a bunch of characters. Just use them as is. And then we also have to anchor them. And the anchors are actually different. So it's confusing. And at the end, this is the trick, the case insensitive. So uppercase, lowercase, I don't care. But you can remove all of these. And instead, you can use FC. FC's fault case, and what fault case does, is folded in a way that is Unicode case insensitive. It's fantastic. Can't talk about it. Okay, surprisingly enough, it was written by a guy named FC. He stands for Father of Chrysostomus, but everyone calls him FC because no one really has the effort of saying Chrysostomus. Okay, regex set operations, that's already in Pro. That's before 5.24. You could do stuff like that. This is asking for a digit of either a tie or a loathing script. This is plus on these, I don't present there. It works. You can do a lot of stuff like that. Take all the word characters, accept the lowercase ones. That works, they're already available. Lexical subroutines, they're already in, I love Lexical subroutines, because they do something really interesting. Let's say we have an app here, new. We have some kind of information attribute or method. And we wanna call that getting either the value or if there is no value, we wanna call it, this is great. We wanna call the initialize value and we want the initialize value to also set the value and to return the value so in the future it will be cached. I love Pro, it's like one line, that's it. So we have this and you can clearly see that we put an underscore in front of initialize value to make sure it's private. Now no one can actually call it, it's safe. No one will find it, no one can call it. But now what we can do is put a my in front of it, it's a Lexical sub. Now no one can call it. It's very nice, it's very cool. People have wanted this for a very long time, we have it. And a lot of people are like, oh really? Yeah, so I can't talk about. Subroutine signatures, which we always talk about, we have subroutine signatures. Take this small function, let's put two variables in there for first and left, left and right and then use them directly or maybe you wanna have a third and this one says, you know what, have a placeholder there. So I don't actually wanna give it a name, but there is something there. So just make a note of that or maybe even give it a default value or maybe use something that already exists and also change it every time. Why not? Or use something that actually exists earlier on. That will work, it will do that. It will use the first name from there as a default for the nickname. And of course Slurpee and maybe you wanna change that into a hash, it'll work too and these nice, nice stuff. That's kinda nice. Key value slices, I use key value slices a lot. How many people use key value slices? Okay, this is really nice. You can use it now and it's even better. So let's take this array of days. How many times did you call a function and gets a date and then it gives you the days and it's like zero, one, two, three, four and you have to figure out. So we can take the first and last, it's a simple slice, what you see here is an at that basically means in purl, the sigil, purl five, the sigil doesn't refer to what variable it is. It refers to what you want to receive back. What are you accessing? And this is, I'm accessing multiple things and it will find using the identifier and this access one with variable it is and what we say is I want to get from this array two items. So no problem, you get them, they'll be put in those two. You can also give a range. I use this all the time. Which I go to a hash and I want to retrieve again multiple values, you can see this over here and I'll give two keys and it will access it. This is not new, this is not new at all. What also isn't new is this new thing which has existed before 524. So let me show you, let's say we have a hash and we want to get this. What if I want also the keys, not just the values. Usually what we would do is do a map on the keys and then get the key plus the right. But what we can do is take this at that means multiple but instead put it into a percent that says I want multiple but I want it as a subset of a hash. And then when we give the keys, what it will return is an actual subset of foo and bar including their keys and their values. Super useful, but it's not new. We already have this. This is one of the things I use a lot. I use this a lot when I work with time. I always want to get the time and then it gives you all the time in like an array and then you have to figure out which one and the month is seven. And is it starting from zero? Is it starting from and then I create an array or a hash and then I get the right one. It's very annoying. But instead you could do stuff like that. If you give it an array, you actually get the index as a key. She's also very useful. What else do we have? Postfix the referencing. Stephen talked about this, not new, not a lot of people using it. Let me give you a few examples. If we have an array ref, we can do ref in this way. I personally prefer dereferencing instead of just two sigils together. It's very confusing. I prefer to put braces on it to basically say the array that this points to. And if you have something bigger, you always have to have them anyway. But when you have something bigger, you usually write it out and then you go back and wrap it again. But the Postfix D ref does something different. You go forward and you dereference it on the spot at the end by using these two characters. The at is for what you want. The start is always a start. Let's take this example. When I go in, get item one, index one, and then I got to go back and wrap it. Or I could just move forward. One and arrow and at start. This is great. At first it looks really weird, but then you start using it and you don't want to give it up. So it's great. Another example, I like this. I always do this. I can just continue, move forward. It's great. Okay. Variable aliasing via reference. So Perl has so many different types of variables, even though it seems like it doesn't. He has a lot of containers and he has a lot of understanding of different types. And Perl also supports different ways to have your containers like different scopes for them. So you have mine, you have local, you have our, and you have all of these things. One of the things that Perl has is aliasing, which means two variables that actually affect the same thing. And this is different than a ref. A ref is the same address. So if you dereference it, you reach the same thing. But an alias means literally two scalars that are the same place in memory. They don't point to the same place, they are the same place. If we want to create an alias, you just put a backslash in front of the mine. The backslash basically says, bar is foo. So when you change bar over here, this changes this one, which changes this one, which actually goes all the way to here and foo is actually now two. Because it is the same variable. She's really, really nice, because you can do it in loops, stuff like that. We have improved this to also allow the backslash right before bar. But that's actually new, so. All right, some optimizations that we did do. We did a lot of optimizations. I think it's very worth noting the optimizations that we do in Perl. They're very important because our code runs much, much, much faster. The Perl of yesteryear is not as fast as the Perl of today. So integer allocations, they're all faster. They're all faster by about 13%. The guy who worked on it is actually right over there. So way to go, Eric. Because I mean, who uses integers, right? Eric also wrote a great blog post about it, which talks a bit about balancing considerations when you program. And it's available at blogbooking.com. So he also works at booking.com. He wrote a blog post about it. I really recommend it. We have a regex optimizer. It looks at your regex and try to optimize it. We have copy and write, strict regular expression syntax. It's kind of cool. The multi-DRF op is one of my favorite things because we often use structures that are not flat. They have a lot of depth in them. And the multi-DRF op actually avoids a lot of the problems with this when it comes to speed. I'm going to give you an example. Let's say that we have a C variable. And that C, at the bottom of it, we have a hole. And at the bottom of the hole, there's a log. And there's a branch on the log in the hole in the bottom of the C. And on the, what is it? Branch at the edge of a branch. I don't even remember the thing. And there's a frog there. And the frog has a tail. And on the tail, there's a speck. And the speck, there's a fleck. Goes back to this poem of, there's a fleck on the speck, and the tail, and the frog, and the bump, and the branch, and the log in the hole in the bottom of the C. In Perl, if Perl had to actually compile this, and Perl does compile it, it looks like this. Now, this is a lot. And there is some cruft in it. So I'm going to clean it up. This is clean. If you're noticing, it's starting, stopping, whatever. And what you see here, actually, is the HLM is hash element. So go to the hash element. And then it says RV to HV. It says, take this reference value. I like it. I'm getting 15 minutes. We're very, a lot of optimism here. So reference value to hash value. So dereference it, and then go to a hash, and then dereference that. And all of these are the actual constant strings that Perl has in there. In 522, which is a version old, this is how it looks like. Of course, there's also a cruft. So let me just clean that up for you. There we go. All right, so yeah, that's pretty damn fast. OK, CGI, gone. Still available on C-Pan. Thank you. 524. OK, now I can actually start to talk in 15 minutes. So let's talk about 524. We removed some stuff. I want to talk about some of the stuff that we removed. The autodiref, the autodiref was this idea that if we have references, you could just do work on the references themselves instead of having dereferences. That would be amazing, except no, it wasn't. It was not amazing. So we've deprecated, and now it's gone removed. The lexical topical variable was a really interesting idea that almost everyone misused by accident. And when we realized it's actually adding more confusion and not helping, we did the right thing. We said, shit, and then we removed it. So that's gone, too. This one, there was discussion about this. It's a very good example of how people will argue over things that might not matter. Who can tell me what our on my ex does? I double dare you. I won't be able to actually tell you if you're right or wrong, because I don't know. Same goes for a my and a my and an our and a my. And at some point, we just removed it. Like, why have it? Explicit false ch-deer, or ch-deer, to your local directory, your home directory. If you do this, it fails. If you do this, it fails, which is very, very good. This value was that mean, or if it's uninitialized. Now, if you actually want to ch-deer to your home directory instead of by accident, calling one of these sort of things, you just call ch-deer. Like, jeez. Simplicity. OK, some fixes that we've done. Some of them are very important. Line numbering, almost no one uses. But when you did, and if you had something long, we had an integer overflow fixed. Explicit braces are gone. This is an example I usually would give with color, and then people would know because of the color. So what does this do? Two digits. Two digits, good. This was not a trick question. What does this do? This is a trick question. It's two braces. A digit and two braces, opening and closing. Is it obvious? No. What does this do? Braces. Just braces. OK, it's a bit simpler. My syntax hider actually got it right, so people would look at this and go, I know what it does. OK, not the point. So they're gone now. You can't do this anymore. If you want to have an actual brace, just put it backslash. So, yeah. Sorry, I can't hear. I can barely. You can still do the reverse one. Well, some of those are actually slowly were going over all of those to be completely fixed. The search and replace in place, which basically, we refer to this as ProPy. And in ProPy, the P and I, along with the E that just gives you a search and replace code, would change the contents of this file and save it as it is. And it's very, very useful. And the I actually receives a parameter right here, if you want, for a backup. It's great, except if you didn't have enough space on this to do this, whoops. So that's fixed, which is actually useful. Who can tell me what that does? No, no, no, no, no, no, no, no, no, no, no, no, no, no. Right, does that help? OK, so this is good. So far, you're with me. Excellent. What does it do now? If anyone can actually go all the way through, I would appreciate it, you know? It's like two hours. So previously, this was SecFault, just Crash. Instead, now I'm going to use a phrase that Ricardo Shingis, the previous monk, can really like. Instead, now Pearl is just going to use all of your memory and die, which is the right thing to do. If you don't have enough, shouldn't none of us alone. All right, so gone. Some optimizations within 5.24. Now, all of these are actually in. All of this is in. You already have it for almost a year now. So OK, simple arithmetic are faster. We need to do addition, subtraction, multiplication. All these are much faster now, like much, much faster, which is great. We reworked the entire context stack, which doesn't mean anything to you unless we broke your stuff. But what it means to everyone else is what we refer to as cheaper subroutine calls, which actually means faster subroutine calls, which means do you use subroutines? Wouldn't you like them to be like 30% faster? They are. So 30% faster is what I remember. If you do any string matching and regular expression and they are fixed, then they're much faster nowadays, which apparently this is how I have to write emails to get people to read them. This is a true example. Some features that we already have. Post-fix DRF that you saw, that's it. It's in. It's not experimental. It's in. You can use it. It's good. We restored Amigo as support. Thank you. Now you realize that when I said, no, seriously, it's supported in a lot of platforms, you know what I mean. And someone was like, this breaks now. And we're like, all right, let's fix it. And it wasn't that big, but we fixed it. Unicode 8, it's already in. It's already used. Unicode 9 came out after we finished with 5.24. And it takes a while until 5.26 is out. So 5.26 already has Unicode now. It's kind of a surprise. But 8 is already in. Some stuff that 8 provided is a lot of stuff. To most of us, this doesn't mean a lot. But there are various people who either research these languages or speak these languages. And now they can all use it natively, properly, and not just pictures and images and stuff like that. It's very important. I want to give you an example of what you can do in Perl with Unicode. It's really, really nice. So if we use 5.24, some char names, we take a zero width joiner, which allows us to create emojis that are combined from different symbols. And what we can do is this is a concatenation of a heavy black heart, just a type of heart, with a variation selector 16. Does anyone know what variation selector 16 is? EgoG representation. Nice, Paul. It's a bunch of characters put together in two words. No, it's a color red. So this makes a red heart, by just concatenating the color and the heart image. And then we can take characters, and we can take additional characters, and we can just use Unicode just to ask the terminal to use UTF-8. And then we can just combine them with joiner and to create this image. And I would have shown you from the terminal, but Perl is more up-to-date than my terminal. So that worked. And then I tried to use my browser, and none of my browsers are as up-to-date as this, like, dead language. It's like, come on, Firefox. Get with the program. OK. So the diversity system in Unicode is actually already in. So the kind of stuff that I showed with the colors, you can do this with skintones using the Fitzpatrick skintone scheme, which allows you to represent people as who they are in their own flesh, so to speak, rather than an ambiguous color, which is very, very important. It's the same for gender and stuff like that. These are really actual things that impact people. But for most of us, we kind of fit that, so we don't really care. But for a lot of people, it does fit for most of us in programming, I guess. So if we take those modifier colors, Fitzpatrick ones are recognized, and we can just connect them together, this is from a book on a relationship that could not exist before at the time that these women existed, and we can just create these really, really, really nice things. So OK, stuff in 5.26. I'm sort of reaching the end, not really. 5.26 is coming out very, very soon. It's coming out in April. So you already have it very, very soon. What kind of stuff do we have in it? We have a bunch of fixes. Here are some. POSIX temp name, gone. If you want, use file temp, which you should have. If you're using this variable for encoding, don't. It's bad. If you want to, anyway, don't. But if you really, really want to, you can use either filter encoding, or encoding PM has a filter. So use those, or just don't. When you did require with two leading colons that worked for some reason, for some value of worked, gone. The explicit curly braces, I mentioned that the x, so you could put two x's, that's gone. And this doesn't crash anymore. If you add in type blobs that were star, colon, colon, colon, colon, colon, colon, you're safe now. More stuff. We accidentally broke this in 5.18. So it was fixed. We're sorry. And we're also discussing the concept of script runs. Is anyone familiar with the concept of security attacks on script runs in Unicode? So it's kind of like this crazy thing. We're thinking of actually changing this and fixing it and allowing someone to have a Unicode check, a Regex check for Unicode characters from the same script run, which is really interesting. It's not a problem in a language. It's just a problem that you can make. And this tries to help you with it. And we removed Usenet from the documentation because, jeez, OK. Some optimization we did. Bearware constant strings are now constant folded. Doesn't mean a lot other than it's faster. Signature subroutines have been optimized. They are now as fast as not having them, which is already a good reason to use them. In the future version, they will be even more optimized. In the future, we're hoping that subroutine signatures would be faster than not using subroutine signatures, which would be a very good reason to tell your boss that I just have to use this really sweet syntax because it's faster, not because I want to. I don't. It's just faster. And some optimizations for old cows, and if I ate, if possible. Some stuff in Unicode 9, avocado. OK, but other than avocado, because there's whiskey. And I was like, oh my god, there's whiskey. I'm like, no, avocado. Some actual things in Unicode 9, all of these people can now represent themselves the way they are and speak their native tongue the way it is. Which is really nice. And we can investigate these languages and research them much better. So it's very important, very good. Some additional features other than Unicode 9. Syntax improving to ref anything. I mentioned that. The backslash goes after the my. We recognize version control markers. GCC does. Why shouldn't we? Unicode now uses script extensions by default. It's more accurate. We have the const attribute for subroutines. Very useful. Slash xx is actually repurposed. And it means something new. I want to give you an example. These are two examples of regular expressions. And we obviously, it's parole. We don't have to write this thing. We can just use the x. And this gets expanded this way, much better. But with the double x, you can actually expand in between those, which is really, really nice. Because this becomes this. And this becomes, you know, you can see d to e, g to i, and 3 to 7. And if you expand this, it looks like this, which is way better. So that's the two x's. You can have that in April. And then the hear docs, it's about time. I write this all the time. I have a help. I have a message. It's an optional one. So if I have it, I print an error. And then I try to print like a message using some kind of hear doc. And then I write it where I think it should be. And then I realize, no, I have to move it. So it's OK. That doesn't work. And then I put the terminator that won't work. So I have to move that again. And now we have this thing here. Do you see the hear doc right here, beginning? We can now use a tilt there. And that will allow you, together, to actually indent the hear doc to wherever you want. And suddenly it looks like this. It's much nicer, right? Such a pain. OK. Fixed. Done. Thank you. The capture variable, this is the kind of things that I write all the time to try and get them and then try to realize that I get all of them. And no, I didn't get all of them. And then croak. And then how many did I get? And what if it's a question mark? So maybe I don't have a buzz. And then I actually have to maybe have a default for that and then check for it. What you can do now is just use the capture. This variable right there, it gives you all of them. And you can use it as a number to check. There's a hash for it. There's a bunch of stuff. New things. I've got to have to rush this a little bit. Sorry. And script extensions, I already mentioned the same thing. Security. We're moving dot from ink. Sorry. It's actually important. Sorry. OK. Some futuristic stuff. This is actually fairly short. 528 and above. We have some ideas. We have bug fixes already that we know we're going to do, like a lot. We've been fuzzing a lot, so we have a lot of information on various things that crash it. Various optimizations, like a ton. There's a lot of optimization optimizations right now. So it's going to be way faster, like the subject signatures I mentioned, which will no longer be experimental, by the way. The hashing is going to be faster. Maybe we'll have even V-table hashes. And maybe we'll even have a mop, like who knows. We do hackathons. We started our first hackathon for the core. It was very, very successful. And we'll probably do more. These are my parting notes to you. We want to get closer to the community and understand the relationship between the core and what the community writes. And that includes, for example, the tool chain to make sure that we're much more in sync about how the coding core affects real life usages of it with CPAN itself. And we want to emphasize that communication, which is always kind of a problem for tech people. I mean, it's annoying. We're going to introduce deprecations. Specifically, we've introduced that there are no more empty deprecations. You don't get a warning that says, this has been deprecated. Instead, it says, this has been deprecated and will be removed in this version. So you can coordinate your efforts. And people really don't like deprecations. And I know it's upsetting. But think about this for a second. When did Pearl 4 came out? 1991. Pearl 5 came out in 1994. That was 23 years ago. 56 in 2000, 58 that a lot of people talk about, I think, yes, 2002 is 15 years ago. We can't have those programs necessarily always 100% continue working nowadays, especially if we want to move the language forward. I want to keep using Pearl in 10 years. And that means I will want the feature that I will need in 10 years to handle my company scale or my code scale and my requirements in the future. And it's very, very important that we adapt to this. Someone recently said, why did you break this? It's been working since Pearl 4. That's not a good claim. It doesn't convince me yet. Although that one, we did undeprecate because there was no reason to break it. This is a quote that I think is very important. Ted from OpenBSD said, opinions vary as to the cost associated with keeping a legacy code. At the low end, there is the argument that if it's not in the way, there's no harm. At the high end, night capital went bankrupt after losing $400 million in 45 minutes after eight-year-old deactivated code was accidentally reactivated. It doesn't mean start deleting stuff. What it means is there is a balance to uphold. That means that our policy on what we call BBC, which is bleed, pearl, break, CPAN, meaning we make a changing core in the development version and CPAN breaks. There's a module that breaks. Sometimes it's more than one. What we do nowadays is actually open a ticket with the module author. We decide whether we were wrong or maybe they should update their code. We give it a grace period. We help them by submitting a patch. We do all of this nowadays. And it's something we're gonna continue doing. And I hope we're gonna communicate that even more. Last, rules on behavior. This is my rules of behavior. And this is the rules of behavior that we want to enforce anywhere within the Pro 5 core development. And I really suggest within the ITAR community. First, diversity and inclusiveness is crucial. Be welcoming. Be friendly. Be cooperative. What it means to have more people, to be inclusive, to be diverse. It means that you get more eyes on a problem. More hands involved in helping. You get more skills. You have more abilities, different skills and different abilities. It's very crucial to have. You have better code eventually. Cause more people see it, more people can act on it. People think differently. And it means your code is stronger and can handle more things. This is actually a very valuable code wise thing as well. It's very practical to have. And obviously better documentation and better testing, which are all very, very important if we actually want to continue. And of course, just like a much bigger community because I am involved in various communities just because I enjoy it. And if I wouldn't enjoy it, I wouldn't be involved. So if we want to have an even bigger one, we should be like the most fun community ever. And we can be. On the upside, abuse is not helpful. Ever. Ever, ever, ever, ever. No one ever said, man, I'm happy. I made that person feel really bad about themselves. Ever. We have to be a vindictive, horrible person to enjoy that. That's the kind of behavior we don't accept anymore. And we shouldn't ever. Wendy just said, why be nasty? Like, why? And bitterness begets bitterness. So code as difficult as it is for me and code is sometimes very difficult for me, bitterness is harder. Cause I can deal with hard code. It's like, it's just hard. If I get help, I might be able to resolve it. If someone's better, it attacks your very being. Just let it go. A really good sentence. The best way to predict the future is to create it. Go to pro five, Porter's, it's a mailing list. You can join, you can hear what's going on, you can talk to us. You can also read the summaries at all of these places. I try to summarize every single week what was going on, what tickets we have, new, old, fixed, discussions we've had. And I think this is the last sentence I have. Let's make each other proud. Someone said it somewhere to someone else, probably. Or a better yet, be excellent to each other by Abraham Lincoln, of course, from the Bill and Ted movie, but you know, still works, right? Thank you very much.