Challenge 1: A Basic Test File — Possible Solution ==================================================================== # t/strings.t (with the intentional failure, first version) use strict; use warnings; use Test::More; is("Hello" . " " . "World", "Hello World", 'concatenation works'); like("Hello World", qr/World/, 'regex match works'); is(1 + 1, 3, 'this assertion is intentionally wrong'); done_testing(); Running "prove t/strings.t" against this version shows: not ok 3 - this assertion is intentionally wrong # Failed test 'this assertion is intentionally wrong' # got: '2' # expected: '3' FAILED tests 3 Failed 1/3 subtests # t/strings.t (corrected, failing assertion removed) use strict; use warnings; use Test::More; is("Hello" . " " . "World", "Hello World", 'concatenation works'); like("Hello World", qr/World/, 'regex match works'); is(2 + 2, 4, 'basic addition works'); done_testing(); Running "prove t/strings.t" against this version shows: t/strings.t .. ok All tests successful. WHY THIS WORKS AS AN ANSWER ------------------------------ "Hello" . " " . "World" reuses string concatenation (Course 1, Chapter 2) inside is(), reusing the chapter's own preference for is() over a bare ok() specifically because it reports both the actual and expected strings if they ever stop matching. like("Hello World", qr/World/, ...) reuses the chapter's own like() example directly, unchanged — a regex match assertion built on Chapter 1/2's own m// and qr// syntax. The intentionally-failing is(1 + 1, 3, ...) demonstrates exactly what the chapter describes is() reporting on failure: both the "got" value (2, what 1 + 1 actually evaluates to) and the "expected" value (3, what the assertion claimed) are shown separately in the output — directly observing the diagnostic benefit the chapter's own explanation only described in words. Removing that assertion and rerunning prove confirms all three remaining tests pass, closing the loop from "see a failure" to "see it fixed," which is the entire point of the exercise.